Abyssal Wiki abyssalwiki https://abyssal.miraheze.org/wiki/Main_Page MediaWiki 1.40.1 first-letter Media Special Talk User User talk Abyssal Wiki Abyssal Wiki talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Campaign Campaign talk Module Module talk Main Page 0 1 1 2023-09-24T14:08:42Z MediaWiki default 1 Create main page wikitext text/x-wiki __NOTOC__ == Welcome to {{SITENAME}}! == This Main Page was created automatically and it seems it hasn't been replaced yet. === For the bureaucrat(s) of this wiki === Hello, and welcome to your new wiki! Thank you for choosing Miraheze for the hosting of your wiki, we hope you will enjoy our hosting. You can immediately start working on your wiki or whenever you want. Need help? No problem! We will help you with your wiki as needed. To start, try checking out these helpful links: * [[mw:Special:MyLanguage/Help:Contents|MediaWiki guide]] (e.g. navigation, editing, deleting pages, blocking users) * [[meta:Special:MyLanguage/FAQ|Miraheze FAQ]] * [[meta:Special:MyLanguage/Request features|Request settings changes on your wiki]]. (Extensions, Skin and Logo/Favicon changes should be done through [[Special:ManageWiki]] on your wiki, see [[meta:Special:MyLanguage/ManageWiki|ManageWiki]] for more information.) ==== I still don't understand X! ==== Well, that's no problem. Even if something isn't explained in the documentation/FAQ, we are still happy to help you. You can find us here: * [[meta:Special:MyLanguage/Help center|On our own Miraheze wiki]] * On [[phab:|Phabricator]] * On [https://miraheze.org/discord Discord] * On IRC in #miraheze on irc.libera.chat ([irc://irc.libera.chat/%23miraheze direct link]; [https://web.libera.chat/?channel=#miraheze webchat]) === For visitors of this wiki === Hello, the default Main Page of this wiki (this page) has not yet been replaced by the bureaucrat(s) of this wiki. The bureaucrat(s) might still be working on a Main Page, so please check again later! 21236ac3f8d65e5563b6da6b70815ca6bf1e6616 4 1 2023-09-24T15:19:11Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="text-align:center">Abyssal is a Roblox cooperative obby game developed by nextReality Studios.<div style="padding-top:7px">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. Help us by contributing today!</div> fabe51617d0303b84e2679a1a74c7304c29aa0fe 7 4 2023-09-24T16:25:34Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="text-align:center">Abyssal is a Roblox cooperative obby game developed by nextReality Studios.<div style="padding-top:7px">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</div></div> <!--{| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |} {| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |} {| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |} {| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |} {| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |} {| class="wikitable" style="float:left;width:20%" ! [[Characters]] |- | 1<br>2 |}--> 9d8c18231caad88ace24a575ad72c8785ebf5b79 17 7 2023-10-06T16:07:42Z Silentg 2 draft wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:73%"> <p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p> <p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p>New to the game? Here are a few pages that might be useful for you:</p> <div></div> </div> 8fe8e17a3761b0b5ead26f4ca5875bf2ee881e28 18 17 2023-10-06T16:14:11Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%"> <p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p> <p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:1px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p>New to the game? Here are a few pages that might be useful for you:</p> <div></div> </div> 1625be05acef5f86c18721db16e711429f349e8a 19 18 2023-10-06T16:20:50Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%"> <p style="padding-left:2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p> <p style="padding-left:2px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:1px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p>New to the game? Here are a few pages that might be useful for you:</p> <div></div> </div> c69dd683313841ef511df07a429b9df8a16e322e 20 19 2023-10-06T16:39:01Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:3px;max-width:73%"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a Roblox cooperative obby game developed by nextReality Studios.</p> <p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:3px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:3px;max-width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Items]]</li> <li>[[Characters]]</li> </ul> </div> 0429909a723e3081cb1ab62e9f53de636da32116 21 20 2023-10-06T16:52:30Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;max-width:74%"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> <p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:0px 0px 0px 2px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:2px 0px 0px 0px;max-width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Items]]</li> <li>[[Characters]]</li> </ul> </div> a9a3e1c8b41d8fd08c8634da90bb81b66dac21c2 MediaWiki:Mainpage-title 8 2 2 2023-09-24T15:15:37Z Silentg 2 Created page with "-" wikitext text/x-wiki - 3bc15c8aae3e4124dd409035f32ea2fd6835efc9 9 2 2023-09-25T13:32:51Z Silentg 2 wikitext text/x-wiki a 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 10 9 2023-09-25T13:33:05Z Silentg 2 Blanked the page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 MediaWiki:Mainpage-title-loggedin 8 3 3 2023-09-24T15:16:07Z Silentg 2 Created page with "-" wikitext text/x-wiki - 3bc15c8aae3e4124dd409035f32ea2fd6835efc9 5 3 2023-09-24T15:20:16Z Silentg 2 wikitext text/x-wiki Abyssal Wiki 08ac98cc12fb510dbdad6059b653fa60890b7af7 6 5 2023-09-24T15:20:44Z Silentg 2 Blanked the page wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 User:Silentg 2 4 8 2023-09-25T13:31:26Z Silentg 2 Created page with "Hello!" wikitext text/x-wiki Hello! 69342c5c39e5ae5f0077aecc32c0f81811fb8193 User:Silentg/common.css 2 5 11 2023-09-28T07:07:15Z Silentg 2 Created page with "body { background-color: #24244b; }" css text/css body { background-color: #24244b; } 0415815ff940e0a5c5d3407faa684bb21e33f99c 12 11 2023-09-28T07:07:45Z Silentg 2 Silentg moved page [[User:Silentg/Common.css]] to [[User:Silentg/common.css]] without leaving a redirect css text/css body { background-color: #24244b; } 0415815ff940e0a5c5d3407faa684bb21e33f99c 13 12 2023-09-28T07:09:18Z Silentg 2 css text/css body { background-size: cover; background-color: #24244b; } baf761b78705daa7c9ca195bdc7e0c5af13458d2 14 13 2023-09-28T07:12:43Z Silentg 2 css text/css body { background-size: cover; background-color: #24244b; } #mw-page-base { background: none; } 8e18210be5fbba32e48685368c0582d8969155fe 15 14 2023-09-28T07:15:54Z Silentg 2 css text/css body { background: no-repeat center center fixed; background-size: cover; background-color: #24244b; } #mw-page-base { background: none; } 1fe69673e695daac6d4ffb503692fd7d7faf6ea2 16 15 2023-09-28T09:56:59Z Silentg 2 css text/css body { background: no-repeat center center fixed; background-size: cover; background-color: #24244b; } #mw-page-base { background: none; } #p-cactions ul li, #p-cactions ul li a { border-top-left-radius: 1em; border-top-right-radius: 1em; } #content { border-top-left-radius: 1em; border-bottom-left-radius: 1em; } .pBody { border-top-right-radius: 1em; border-bottom-right-radius: 1em; } 546a9a14ce32bc8d5771d38a7a5d5156b1e04182 Module:Infobox 828 6 22 2023-10-07T13:54:14Z Silentg 2 Copied from Wikipedia Scribunto text/plain -- copied from Wikipedia local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' }, hlist_t = { patterns = { '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found = false, styles = 'Hlist/styles.css' } } local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end local function fixChildBoxes(sval, tt) local function notempty( s ) return s and s:match( '%S' ) end if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval -- start moving templatestyles and categories inside of table rows local slast = '' while slast ~= s do slast = s s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') end -- end moving templatestyles and categories inside of table rows s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- the next two lines add a newline at the end of lists for the PHP parser -- [[Special:Diff/849054481]] -- remove when [[:phab:T191516]] is fixed or OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end -- Cleans empty tables local function cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header and rowArgs.header ~= '_BLANK_' then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass }) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '2') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) if rowArgs.data then root:wikitext( '[[Category:Pages using infobox templates with ignored data cells]]' ) end elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ rowArgs.rowclass, rowArgs.class }) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) if rowArgs.label then row :tag('th') :attr('scope', 'row') :addClass('infobox-label') -- @deprecated next; target .infobox-<name> .infobox-label :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') dataCell :attr('colspan', not rowArgs.label and '2' or nil) :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox(-full)-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) else table.insert(empty_row_categories, rowArgs.data or '') end end local function renderTitle() if not args.title then return end has_rows = true has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_rows = true has_list_class({ args.aboveclass }) root :tag('tr') :tag('th') :attr('colspan', '2') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(fixChildBoxes(args.above,'th')) end local function renderBelowRow() if not args.below then return end has_rows = true has_list_class({ args.belowclass }) root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end local function addSubheaderRow(subheaderArgs) if subheaderArgs.data and subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ subheaderArgs.rowclass, subheaderArgs.class }) local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :wikitext(fixChildBoxes(subheaderArgs.data, 'td')) else table.insert(empty_row_categories, subheaderArgs.data or '') end end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if imageArgs.data and imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then has_rows = true has_list_class({ imageArgs.rowclass, imageArgs.class }) local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '2') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :wikitext(fixChildBoxes(imageArgs.data, 'td')) else table.insert(empty_row_categories, imageArgs.data or '') end end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() if not args.autoheaders then return end local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' .. tostring(num)] then if lastheader then args['header' .. tostring(lastheader)] = nil end lastheader = num elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub( category_in_empty_row_pattern, '' ):match('^%S') then local data = args['data' .. tostring(num)] if data:gsub(category_in_empty_row_pattern, ''):match('%S') then lastheader = nil end end end if lastheader then args['header' .. tostring(lastheader)] = nil end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] }) end end local function renderNavBar() if not args.name then return end has_rows = true root :tag('tr') :tag('td') :attr('colspan', '2') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(require('Module:Italic title')._main({})) end end -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() for _, s in ipairs(empty_row_categories) do root:wikitext(s) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() if args.decat == 'yes' then return end if args.child == 'yes' then if args.title then root:wikitext( '[[Category:Pages using embedded infobox templates with the title parameter]]' ) end elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() local hlist_templatestyles = '' if lists.hlist_t.found then hlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.hlist_t.styles } } end local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because the rows of interest invoking -- each class may not be on a specific page hlist_templatestyles, plainlist_templatestyles, base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderEmptyRowCategories() renderTrackingCategories() cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() if args.child ~= 'yes' then root = mw.html.create('table') root :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) has_list_class({ args.bodyclass }) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title) end structure_infobox_common() return loadTemplateStyles() .. root end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 1 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame) origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end return p e82a67c885068bdb7894e38699935058a1825e56 Template:Infobox 10 7 23 2023-10-07T13:56:52Z Silentg 2 Copied from Wikipedia wikitext text/x-wiki {{#invoke:Infobox|infobox}}<includeonly>{{template other|{{#ifeq:{{PAGENAME}}|Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}</includeonly><noinclude> {{documentation}} <!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --> </noinclude> 817a9f5b6524eced06a57bd1d5fd7179f9369bf2 Module:Infobox/styles.css 828 8 24 2023-10-07T14:00:46Z Silentg 2 Created page with "/* copied from Wikipedia */ /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox..." sanitized-css text/css /* copied from Wikipedia */ /* {{pp|small=y}} */ /* * This TemplateStyles sheet deliberately does NOT include the full set of * infobox styles. We are still working to migrate all of the manual * infoboxes. See [[MediaWiki talk:Common.css/to do#Infobox]] * DO NOT ADD THEM HERE */ /* * not strictly certain these styles are necessary since the modules now * exclusively output infobox-subbox or infobox, not both * just replicating the module faithfully */ .infobox-subbox { padding: 0; border: none; margin: -3px; width: auto; min-width: 100%; font-size: 100%; clear: none; float: none; background-color: transparent; } .infobox-3cols-child { margin: auto; } .infobox .navbar { font-size: 100%; } /* T281642 */ body.skin-minerva .infobox-header, body.skin-minerva .infobox-subheader, body.skin-minerva .infobox-above, body.skin-minerva .infobox-title, body.skin-minerva .infobox-image, body.skin-minerva .infobox-full-data, body.skin-minerva .infobox-below { text-align: center; } 5a78c86e35a2e25712bf20a318203ae686a1906a Template:Documentation 10 9 25 2023-10-07T14:03:38Z Silentg 2 Copied from Wikipedia wikitext text/x-wiki {{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}<noinclude> <!-- Add categories to the /doc subpage --> </noinclude> 9e62b964e96c4e3d478edecbfcb3c0338ae8a276 Module:Documentation 828 10 26 2023-10-07T14:05:53Z Silentg 2 Created page with "-- copied from Wikipedia -- This module implements {{documentation}}. -- Get required modules. local getArgs = require('Module:Arguments').getArgs -- Get the config table. local cfg = mw.loadData('Module:Documentation/config') local p = {} -- Often-used functions. local ugsub = mw.ustring.gsub local format = mw.ustring.format ---------------------------------------------------------------------------- -- Helper functions -- -- These are defined as local functions,..." Scribunto text/plain -- copied from Wikipedia -- This module implements {{documentation}}. -- Get required modules. local getArgs = require('Module:Arguments').getArgs -- Get the config table. local cfg = mw.loadData('Module:Documentation/config') local p = {} -- Often-used functions. local ugsub = mw.ustring.gsub local format = mw.ustring.format ---------------------------------------------------------------------------- -- Helper functions -- -- These are defined as local functions, but are made available in the p -- table for testing purposes. ---------------------------------------------------------------------------- local function message(cfgKey, valArray, expectType) --[[ -- Gets a message from the cfg table and formats it if appropriate. -- The function raises an error if the value from the cfg table is not -- of the type expectType. The default type for expectType is 'string'. -- If the table valArray is present, strings such as $1, $2 etc. in the -- message are substituted with values from the table keys [1], [2] etc. -- For example, if the message "foo-message" had the value 'Foo $2 bar $1.', -- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz." --]] local msg = cfg[cfgKey] expectType = expectType or 'string' if type(msg) ~= expectType then error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2) end if not valArray then return msg end local function getMessageVal(match) match = tonumber(match) return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4) end return ugsub(msg, '$([1-9][0-9]*)', getMessageVal) end p.message = message local function makeWikilink(page, display) if display then return format('[[%s|%s]]', page, display) else return format('[[%s]]', page) end end p.makeWikilink = makeWikilink local function makeCategoryLink(cat, sort) local catns = mw.site.namespaces[14].name return makeWikilink(catns .. ':' .. cat, sort) end p.makeCategoryLink = makeCategoryLink local function makeUrlLink(url, display) return format('[%s %s]', url, display) end p.makeUrlLink = makeUrlLink local function makeToolbar(...) local ret = {} local lim = select('#', ...) if lim < 1 then return nil end for i = 1, lim do ret[#ret + 1] = select(i, ...) end -- 'documentation-toolbar' return format( '<span class="%s">(%s)</span>', message('toolbar-class'), table.concat(ret, ' &#124; ') ) end p.makeToolbar = makeToolbar ---------------------------------------------------------------------------- -- Argument processing ---------------------------------------------------------------------------- local function makeInvokeFunc(funcName) return function (frame) local args = getArgs(frame, { valueFunc = function (key, value) if type(value) == 'string' then value = value:match('^%s*(.-)%s*$') -- Remove whitespace. if key == 'heading' or value ~= '' then return value else return nil end else return value end end }) return p[funcName](args) end end ---------------------------------------------------------------------------- -- Entry points ---------------------------------------------------------------------------- function p.nonexistent(frame) if mw.title.getCurrentTitle().subpageText == 'testcases' then return frame:expandTemplate{title = 'module test cases notice'} else return p.main(frame) end end p.main = makeInvokeFunc('_main') function p._main(args) --[[ -- This function defines logic flow for the module. -- @args - table of arguments passed by the user --]] local env = p.getEnvironment(args) local root = mw.html.create() root :wikitext(p._getModuleWikitext(args, env)) :wikitext(p.protectionTemplate(env)) :wikitext(p.sandboxNotice(args, env)) :tag('div') -- 'documentation-container' :addClass(message('container')) :attr('role', 'complementary') :attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil) :attr('aria-label', args.heading == '' and 'Documentation' or nil) :newline() :tag('div') -- 'documentation' :addClass(message('main-div-classes')) :newline() :wikitext(p._startBox(args, env)) :wikitext(p._content(args, env)) :tag('div') -- 'documentation-clear' :addClass(message('clear')) :done() :newline() :done() :wikitext(p._endBox(args, env)) :done() :wikitext(p.addTrackingCategories(env)) -- 'Module:Documentation/styles.css' return mw.getCurrentFrame():extensionTag ( 'templatestyles', '', {src=cfg['templatestyles'] }) .. tostring(root) end ---------------------------------------------------------------------------- -- Environment settings ---------------------------------------------------------------------------- function p.getEnvironment(args) --[[ -- Returns a table with information about the environment, including title -- objects and other namespace- or path-related data. -- @args - table of arguments passed by the user -- -- Title objects include: -- env.title - the page we are making documentation for (usually the current title) -- env.templateTitle - the template (or module, file, etc.) -- env.docTitle - the /doc subpage. -- env.sandboxTitle - the /sandbox subpage. -- env.testcasesTitle - the /testcases subpage. -- -- Data includes: -- env.protectionLevels - the protection levels table of the title object. -- env.subjectSpace - the number of the title's subject namespace. -- env.docSpace - the number of the namespace the title puts its documentation in. -- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace. -- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template. -- -- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value -- returned will be nil. --]] local env, envFuncs = {}, {} -- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value -- returned by that function is memoized in the env table so that we don't call any of the functions -- more than once. (Nils won't be memoized.) setmetatable(env, { __index = function (t, key) local envFunc = envFuncs[key] if envFunc then local success, val = pcall(envFunc) if success then env[key] = val -- Memoise the value. return val end end return nil end }) function envFuncs.title() -- The title object for the current page, or a test page passed with args.page. local title local titleArg = args.page if titleArg then title = mw.title.new(titleArg) else title = mw.title.getCurrentTitle() end return title end function envFuncs.templateTitle() --[[ -- The template (or module, etc.) title object. -- Messages: -- 'sandbox-subpage' --> 'sandbox' -- 'testcases-subpage' --> 'testcases' --]] local subjectSpace = env.subjectSpace local title = env.title local subpage = title.subpageText if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then return mw.title.makeTitle(subjectSpace, title.baseText) else return mw.title.makeTitle(subjectSpace, title.text) end end function envFuncs.docTitle() --[[ -- Title object of the /doc subpage. -- Messages: -- 'doc-subpage' --> 'doc' --]] local title = env.title local docname = args[1] -- User-specified doc page. local docpage if docname then docpage = docname else docpage = env.docpageBase .. '/' .. message('doc-subpage') end return mw.title.new(docpage) end function envFuncs.sandboxTitle() --[[ -- Title object for the /sandbox subpage. -- Messages: -- 'sandbox-subpage' --> 'sandbox' --]] return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage')) end function envFuncs.testcasesTitle() --[[ -- Title object for the /testcases subpage. -- Messages: -- 'testcases-subpage' --> 'testcases' --]] return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage')) end function envFuncs.protectionLevels() -- The protection levels table of the title object. return env.title.protectionLevels end function envFuncs.subjectSpace() -- The subject namespace number. return mw.site.namespaces[env.title.namespace].subject.id end function envFuncs.docSpace() -- The documentation namespace number. For most namespaces this is the -- same as the subject namespace. However, pages in the Article, File, -- MediaWiki or Category namespaces must have their /doc, /sandbox and -- /testcases pages in talk space. local subjectSpace = env.subjectSpace if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then return subjectSpace + 1 else return subjectSpace end end function envFuncs.docpageBase() -- The base page of the /doc, /sandbox, and /testcases subpages. -- For some namespaces this is the talk page, rather than the template page. local templateTitle = env.templateTitle local docSpace = env.docSpace local docSpaceText = mw.site.namespaces[docSpace].name -- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon. return docSpaceText .. ':' .. templateTitle.text end function envFuncs.compareUrl() -- Diff link between the sandbox and the main template using [[Special:ComparePages]]. local templateTitle = env.templateTitle local sandboxTitle = env.sandboxTitle if templateTitle.exists and sandboxTitle.exists then local compareUrl = mw.uri.canonicalUrl( 'Special:ComparePages', { page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText} ) return tostring(compareUrl) else return nil end end return env end ---------------------------------------------------------------------------- -- Auxiliary templates ---------------------------------------------------------------------------- p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext') function p._getModuleWikitext(args, env) local currentTitle = mw.title.getCurrentTitle() if currentTitle.contentModel ~= 'Scribunto' then return end pcall(require, currentTitle.prefixedText) -- if it fails, we don't care local moduleWikitext = package.loaded["Module:Module wikitext"] if moduleWikitext then return moduleWikitext.main() end end function p.sandboxNotice(args, env) --[=[ -- Generates a sandbox notice for display above sandbox pages. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]' -- 'sandbox-notice-blurb' --> 'This is the $1 for $2.' -- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).' -- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page' -- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page' -- 'sandbox-notice-pagetype-other' --> 'sandbox page' -- 'sandbox-notice-compare-link-display' --> 'diff' -- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.' -- 'sandbox-notice-testcases-link-display' --> 'test cases' -- 'sandbox-category' --> 'Template sandboxes' --]=] local title = env.title local sandboxTitle = env.sandboxTitle local templateTitle = env.templateTitle local subjectSpace = env.subjectSpace if not (subjectSpace and title and sandboxTitle and templateTitle and mw.title.equals(title, sandboxTitle)) then return nil end -- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text". local omargs = {} omargs.image = message('sandbox-notice-image') -- Get the text. We start with the opening blurb, which is something like -- "This is the template sandbox for [[Template:Foo]] (diff)." local text = '' local pagetype if subjectSpace == 10 then pagetype = message('sandbox-notice-pagetype-template') elseif subjectSpace == 828 then pagetype = message('sandbox-notice-pagetype-module') else pagetype = message('sandbox-notice-pagetype-other') end local templateLink = makeWikilink(templateTitle.prefixedText) local compareUrl = env.compareUrl if compareUrl then local compareDisplay = message('sandbox-notice-compare-link-display') local compareLink = makeUrlLink(compareUrl, compareDisplay) text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink}) else text = text .. message('sandbox-notice-blurb', {pagetype, templateLink}) end -- Get the test cases page blurb if the page exists. This is something like -- "See also the companion subpage for [[Template:Foo/testcases|test cases]]." local testcasesTitle = env.testcasesTitle if testcasesTitle and testcasesTitle.exists then if testcasesTitle.contentModel == "Scribunto" then local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display') local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink}) else local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display') local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay) text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink}) end end -- Add the sandbox to the sandbox category. omargs.text = text .. makeCategoryLink(message('sandbox-category')) -- 'documentation-clear' return '<div class="' .. message('clear') .. '"></div>' .. require('Module:Message box').main('ombox', omargs) end function p.protectionTemplate(env) -- Generates the padlock icon in the top right. -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'protection-template' --> 'pp-template' -- 'protection-template-args' --> {docusage = 'yes'} local protectionLevels = env.protectionLevels if not protectionLevels then return nil end local editProt = protectionLevels.edit and protectionLevels.edit[1] local moveProt = protectionLevels.move and protectionLevels.move[1] if editProt then -- The page is edit-protected. return require('Module:Protection banner')._main{ message('protection-reason-edit'), small = true } elseif moveProt and moveProt ~= 'autoconfirmed' then -- The page is move-protected but not edit-protected. Exclude move -- protection with the level "autoconfirmed", as this is equivalent to -- no move protection at all. return require('Module:Protection banner')._main{ action = 'move', small = true } else return nil end end ---------------------------------------------------------------------------- -- Start box ---------------------------------------------------------------------------- p.startBox = makeInvokeFunc('_startBox') function p._startBox(args, env) --[[ -- This function generates the start box. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make -- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox -- which generate the box HTML. --]] env = env or p.getEnvironment(args) local links local content = args.content if not content or args[1] then -- No need to include the links if the documentation is on the template page itself. local linksData = p.makeStartBoxLinksData(args, env) if linksData then links = p.renderStartBoxLinks(linksData) end end -- Generate the start box html. local data = p.makeStartBoxData(args, env, links) if data then return p.renderStartBox(data) else -- User specified no heading. return nil end end function p.makeStartBoxLinksData(args, env) --[[ -- Does initial processing of data to make the [view] [edit] [history] [purge] links. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'view-link-display' --> 'view' -- 'edit-link-display' --> 'edit' -- 'history-link-display' --> 'history' -- 'purge-link-display' --> 'purge' -- 'module-preload' --> 'Template:Documentation/preload-module-doc' -- 'docpage-preload' --> 'Template:Documentation/preload' -- 'create-link-display' --> 'create' --]] local subjectSpace = env.subjectSpace local title = env.title local docTitle = env.docTitle if not title or not docTitle then return nil end if docTitle.isRedirect then docTitle = docTitle.redirectTarget end -- Create link if /doc doesn't exist. local preload = args.preload if not preload then if subjectSpace == 828 then -- Module namespace preload = message('module-preload') else preload = message('docpage-preload') end end return { title = title, docTitle = docTitle, -- View, display, edit, and purge links if /doc exists. viewLinkDisplay = message('view-link-display'), editLinkDisplay = message('edit-link-display'), historyLinkDisplay = message('history-link-display'), purgeLinkDisplay = message('purge-link-display'), preload = preload, createLinkDisplay = message('create-link-display') } end function p.renderStartBoxLinks(data) --[[ -- Generates the [view][edit][history][purge] or [create][purge] links from the data table. -- @data - a table of data generated by p.makeStartBoxLinksData --]] local docTitle = data.docTitle -- yes, we do intend to purge the template page on which the documentation appears local purgeLink = makeWikilink("Special:Purge/" .. data.title.prefixedText, data.purgeLinkDisplay) if docTitle.exists then local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay) local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, data.editLinkDisplay) local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, data.historyLinkDisplay) return "&#91;" .. viewLink .. "&#93; &#91;" .. editLink .. "&#93; &#91;" .. historyLink .. "&#93; &#91;" .. purgeLink .. "&#93;" else local createLink = makeUrlLink(docTitle:canonicalUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay) return "&#91;" .. createLink .. "&#93; &#91;" .. purgeLink .. "&#93;" end return ret end function p.makeStartBoxData(args, env, links) --[=[ -- Does initial processing of data to pass to the start-box render function, p.renderStartBox. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error. -- -- Messages: -- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' -- 'template-namespace-heading' --> 'Template documentation' -- 'module-namespace-heading' --> 'Module documentation' -- 'file-namespace-heading' --> 'Summary' -- 'other-namespaces-heading' --> 'Documentation' -- 'testcases-create-link-display' --> 'create' --]=] local subjectSpace = env.subjectSpace if not subjectSpace then -- Default to an "other namespaces" namespace, so that we get at least some output -- if an error occurs. subjectSpace = 2 end local data = {} -- Heading local heading = args.heading -- Blank values are not removed. if heading == '' then -- Don't display the start box if the heading arg is defined but blank. return nil end if heading then data.heading = heading elseif subjectSpace == 10 then -- Template namespace data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading') elseif subjectSpace == 828 then -- Module namespace data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading') elseif subjectSpace == 6 then -- File namespace data.heading = message('file-namespace-heading') else data.heading = message('other-namespaces-heading') end -- Heading CSS local headingStyle = args['heading-style'] if headingStyle then data.headingStyleText = headingStyle else -- 'documentation-heading' data.headingClass = message('main-div-heading-class') end -- Data for the [view][edit][history][purge] or [create] links. if links then -- 'mw-editsection-like plainlinks' data.linksClass = message('start-box-link-classes') data.links = links end return data end function p.renderStartBox(data) -- Renders the start box html. -- @data - a table of data generated by p.makeStartBoxData. local sbox = mw.html.create('div') sbox -- 'documentation-startbox' :addClass(message('start-box-class')) :newline() :tag('span') :addClass(data.headingClass) :attr('id', 'documentation-heading') :cssText(data.headingStyleText) :wikitext(data.heading) local links = data.links if links then sbox:tag('span') :addClass(data.linksClass) :attr('id', data.linksId) :wikitext(links) end return tostring(sbox) end ---------------------------------------------------------------------------- -- Documentation content ---------------------------------------------------------------------------- p.content = makeInvokeFunc('_content') function p._content(args, env) -- Displays the documentation contents -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment env = env or p.getEnvironment(args) local docTitle = env.docTitle local content = args.content if not content and docTitle and docTitle.exists then content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText} end -- The line breaks below are necessary so that "=== Headings ===" at the start and end -- of docs are interpreted correctly. return '\n' .. (content or '') .. '\n' end p.contentTitle = makeInvokeFunc('_contentTitle') function p._contentTitle(args, env) env = env or p.getEnvironment(args) local docTitle = env.docTitle if not args.content and docTitle and docTitle.exists then return docTitle.prefixedText else return '' end end ---------------------------------------------------------------------------- -- End box ---------------------------------------------------------------------------- p.endBox = makeInvokeFunc('_endBox') function p._endBox(args, env) --[=[ -- This function generates the end box (also known as the link box). -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- --]=] -- Get environment data. env = env or p.getEnvironment(args) local subjectSpace = env.subjectSpace local docTitle = env.docTitle if not subjectSpace or not docTitle then return nil end -- Check whether we should output the end box at all. Add the end -- box by default if the documentation exists or if we are in the -- user, module or template namespaces. local linkBox = args['link box'] if linkBox == 'off' or not ( docTitle.exists or subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10 ) then return nil end -- Assemble the link box. local text = '' if linkBox then text = text .. linkBox else text = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]." if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then -- We are in the user, template or module namespaces. -- Add sandbox and testcases links. -- "Editors can experiment in this template's sandbox and testcases pages." text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />' if not args.content and not args[1] then -- "Please add categories to the /doc subpage." -- Don't show this message with inline docs or with an explicitly specified doc page, -- as then it is unclear where to add the categories. text = text .. (p.makeCategoriesBlurb(args, env) or '') end text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template" end end local box = mw.html.create('div') -- 'documentation-metadata' box:attr('role', 'note') :addClass(message('end-box-class')) -- 'plainlinks' :addClass(message('end-box-plainlinks')) :wikitext(text) :done() return '\n' .. tostring(box) end function p.makeDocPageBlurb(args, env) --[=[ -- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)". -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'edit-link-display' --> 'edit' -- 'history-link-display' --> 'history' -- 'transcluded-from-blurb' --> -- 'The above [[Wikipedia:Template documentation|documentation]] -- is [[Help:Transclusion|transcluded]] from $1.' -- 'module-preload' --> 'Template:Documentation/preload-module-doc' -- 'create-link-display' --> 'create' -- 'create-module-doc-blurb' --> -- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].' --]=] local docTitle = env.docTitle if not docTitle then return nil end local ret if docTitle.exists then -- /doc exists; link to it. local docLink = makeWikilink(docTitle.prefixedText) local editDisplay = message('edit-link-display') local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay) local historyDisplay = message('history-link-display') local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, historyDisplay) ret = message('transcluded-from-blurb', {docLink}) .. ' ' .. makeToolbar(editLink, historyLink) .. '<br />' elseif env.subjectSpace == 828 then -- /doc does not exist; ask to create it. local createUrl = docTitle:canonicalUrl{action = 'edit', preload = message('module-preload')} local createDisplay = message('create-link-display') local createLink = makeUrlLink(createUrl, createDisplay) ret = message('create-module-doc-blurb', {createLink}) .. '<br />' end return ret end function p.makeExperimentBlurb(args, env) --[[ -- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages." -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- -- Messages: -- 'sandbox-link-display' --> 'sandbox' -- 'sandbox-edit-link-display' --> 'edit' -- 'compare-link-display' --> 'diff' -- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox' -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' -- 'sandbox-create-link-display' --> 'create' -- 'mirror-edit-summary' --> 'Create sandbox version of $1' -- 'mirror-link-display' --> 'mirror' -- 'mirror-link-preload' --> 'Template:Documentation/mirror' -- 'sandbox-link-display' --> 'sandbox' -- 'testcases-link-display' --> 'testcases' -- 'testcases-edit-link-display'--> 'edit' -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' -- 'testcases-create-link-display' --> 'create' -- 'testcases-link-display' --> 'testcases' -- 'testcases-edit-link-display' --> 'edit' -- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases' -- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases' -- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.' -- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.' --]] local subjectSpace = env.subjectSpace local templateTitle = env.templateTitle local sandboxTitle = env.sandboxTitle local testcasesTitle = env.testcasesTitle local templatePage = templateTitle.prefixedText if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then return nil end -- Make links. local sandboxLinks, testcasesLinks if sandboxTitle.exists then local sandboxPage = sandboxTitle.prefixedText local sandboxDisplay = message('sandbox-link-display') local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay) local sandboxEditDisplay = message('sandbox-edit-link-display') local sandboxEditLink = makeWikilink("Special:EditPage/" .. sandboxPage, sandboxEditDisplay) local compareUrl = env.compareUrl local compareLink if compareUrl then local compareDisplay = message('compare-link-display') compareLink = makeUrlLink(compareUrl, compareDisplay) end sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink) else local sandboxPreload if subjectSpace == 828 then sandboxPreload = message('module-sandbox-preload') else sandboxPreload = message('template-sandbox-preload') end local sandboxCreateUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = sandboxPreload} local sandboxCreateDisplay = message('sandbox-create-link-display') local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay) local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)}) local mirrorPreload = message('mirror-link-preload') local mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary} if subjectSpace == 828 then mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary} end local mirrorDisplay = message('mirror-link-display') local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay) sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink) end if testcasesTitle.exists then local testcasesPage = testcasesTitle.prefixedText local testcasesDisplay = message('testcases-link-display') local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay) local testcasesEditUrl = testcasesTitle:canonicalUrl{action = 'edit'} local testcasesEditDisplay = message('testcases-edit-link-display') local testcasesEditLink = makeWikilink("Special:EditPage/" .. testcasesPage, testcasesEditDisplay) -- for Modules, add testcases run link if exists if testcasesTitle.contentModel == "Scribunto" and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then local testcasesRunLinkDisplay = message('testcases-run-link-display') local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay) testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink) else testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink) end else local testcasesPreload if subjectSpace == 828 then testcasesPreload = message('module-testcases-preload') else testcasesPreload = message('template-testcases-preload') end local testcasesCreateUrl = testcasesTitle:canonicalUrl{action = 'edit', preload = testcasesPreload} local testcasesCreateDisplay = message('testcases-create-link-display') local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay) testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink) end local messageName if subjectSpace == 828 then messageName = 'experiment-blurb-module' else messageName = 'experiment-blurb-template' end return message(messageName, {sandboxLinks, testcasesLinks}) end function p.makeCategoriesBlurb(args, env) --[[ -- Generates the text "Please add categories to the /doc subpage." -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'doc-link-display' --> '/doc' -- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.' --]] local docTitle = env.docTitle if not docTitle then return nil end local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display')) return message('add-categories-blurb', {docPathLink}) end function p.makeSubpagesBlurb(args, env) --[[ -- Generates the "Subpages of this template" link. -- @args - a table of arguments passed by the user -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'template-pagetype' --> 'template' -- 'module-pagetype' --> 'module' -- 'default-pagetype' --> 'page' -- 'subpages-link-display' --> 'Subpages of this $1' --]] local subjectSpace = env.subjectSpace local templateTitle = env.templateTitle if not subjectSpace or not templateTitle then return nil end local pagetype if subjectSpace == 10 then pagetype = message('template-pagetype') elseif subjectSpace == 828 then pagetype = message('module-pagetype') else pagetype = message('default-pagetype') end local subpagesLink = makeWikilink( 'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/', message('subpages-link-display', {pagetype}) ) return message('subpages-blurb', {subpagesLink}) end ---------------------------------------------------------------------------- -- Tracking categories ---------------------------------------------------------------------------- function p.addTrackingCategories(env) --[[ -- Check if {{documentation}} is transcluded on a /doc or /testcases page. -- @env - environment table containing title objects, etc., generated with p.getEnvironment -- Messages: -- 'display-strange-usage-category' --> true -- 'doc-subpage' --> 'doc' -- 'testcases-subpage' --> 'testcases' -- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage' -- -- /testcases pages in the module namespace are not categorised, as they may have -- {{documentation}} transcluded automatically. --]] local title = env.title local subjectSpace = env.subjectSpace if not title or not subjectSpace then return nil end local subpage = title.subpageText local ret = '' if message('display-strange-usage-category', nil, 'boolean') and ( subpage == message('doc-subpage') or subjectSpace ~= 828 and subpage == message('testcases-subpage') ) then ret = ret .. makeCategoryLink(message('strange-usage-category')) end return ret end return p 7f2383ffe6646997daca35086aa243111f9c811c Module:Documentation/doc 828 11 27 2023-10-07T14:08:09Z Silentg 2 Copied from Wikipedia wikitext text/x-wiki {{used in system}} {{Module rating|protected}} {{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}} {{Uses TemplateStyles|Module:Documentation/styles.css}} This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it. == Normal usage == For most uses, you should use the {{tl|documentation}} template; please see that template's page for its usage instructions and parameters. == Use in other modules == To use this module from another Lua module, first load it with <code>require</code>: <syntaxhighlight lang="lua"> local documentation = require('Module:Documentation').main </syntaxhighlight> Then you can simply call it using a table of arguments. <syntaxhighlight lang="lua"> documentation{content = 'Some documentation', ['link box'] = 'My custom link box'} </syntaxhighlight> Please refer to the [[Template:Documentation/doc|template documentation]] for usage instructions and a list of parameters. == Porting to other wikis == The module has a configuration file at [[Module:Documentation/config]] which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. If you have any questions, or you need a feature which is not currently implemented, please leave a message at <span class="plainlinks">[https://en.wikipedia.org/wiki/Template_talk:Documentation Template talk:Documentation]</span><!-- this link uses external link syntax because it is intended to direct users from third-party wikis to the Wikipedia template talk page; in this situation, an internal link would unhelpfully just point to their local template talk page, and the existence of any given interwiki prefix cannot be assumed --> to get the attention of a developer. The messages that need to be customized to display a documentation template/module at the top of module pages are [[MediaWiki:Scribunto-doc-page-show]] and [[MediaWiki:Scribunto-doc-page-does-not-exist]]. 66a5c1cb6e80e28fd79c6c4544ecf09ced7a6360 Module:Documentation/config 828 12 28 2023-10-07T14:09:01Z Silentg 2 Created page with "---------------------------------------------------------------------------------------------------- -- -- Configuration for Module:Documentation -- -- Here you can set the values of the parameters and messages used in Module:Documentation to -- localise it to your wiki and your language. Unless specified otherwise, values given here -- should be string values. ---------------------------------------------------------------------------------..." Scribunto text/plain ---------------------------------------------------------------------------------------------------- -- -- Configuration for Module:Documentation -- -- Here you can set the values of the parameters and messages used in Module:Documentation to -- localise it to your wiki and your language. Unless specified otherwise, values given here -- should be string values. ---------------------------------------------------------------------------------------------------- local cfg = {} -- Do not edit this line. ---------------------------------------------------------------------------------------------------- -- Protection template configuration ---------------------------------------------------------------------------------------------------- -- cfg['protection-reason-edit'] -- The protection reason for edit-protected templates to pass to -- [[Module:Protection banner]]. cfg['protection-reason-edit'] = 'template' --[[ ---------------------------------------------------------------------------------------------------- -- Sandbox notice configuration -- -- On sandbox pages the module can display a template notifying users that the current page is a -- sandbox, and the location of test cases pages, etc. The module decides whether the page is a -- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the -- messages that the notices contains. ---------------------------------------------------------------------------------------------------- --]] -- cfg['sandbox-notice-image'] -- The image displayed in the sandbox notice. cfg['sandbox-notice-image'] = '[[File:Sandbox.svg|50px|alt=|link=]]' --[[ -- cfg['sandbox-notice-pagetype-template'] -- cfg['sandbox-notice-pagetype-module'] -- cfg['sandbox-notice-pagetype-other'] -- The page type of the sandbox page. The message that is displayed depends on the current subject -- namespace. This message is used in either cfg['sandbox-notice-blurb'] or -- cfg['sandbox-notice-diff-blurb']. --]] cfg['sandbox-notice-pagetype-template'] = '[[Wikipedia:Template test cases|template sandbox]] page' cfg['sandbox-notice-pagetype-module'] = '[[Wikipedia:Template test cases|module sandbox]] page' cfg['sandbox-notice-pagetype-other'] = 'sandbox page' --[[ -- cfg['sandbox-notice-blurb'] -- cfg['sandbox-notice-diff-blurb'] -- cfg['sandbox-notice-diff-display'] -- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence -- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page -- type, which is either cfg['sandbox-notice-pagetype-template'], -- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what -- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between -- the sandbox and the main template. The display value of the diff link is set by -- cfg['sandbox-notice-compare-link-display']. --]] cfg['sandbox-notice-blurb'] = 'This is the $1 for $2.' cfg['sandbox-notice-diff-blurb'] = 'This is the $1 for $2 ($3).' cfg['sandbox-notice-compare-link-display'] = 'diff' --[[ -- cfg['sandbox-notice-testcases-blurb'] -- cfg['sandbox-notice-testcases-link-display'] -- cfg['sandbox-notice-testcases-run-blurb'] -- cfg['sandbox-notice-testcases-run-link-display'] -- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page -- corresponding to this sandbox that they can edit. $1 is a link to the test cases page. -- cfg['sandbox-notice-testcases-link-display'] is the display value for that link. -- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page -- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test -- cases page, and $2 is a link to the page to run it. -- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test -- cases. --]] cfg['sandbox-notice-testcases-blurb'] = 'See also the companion subpage for $1.' cfg['sandbox-notice-testcases-link-display'] = 'test cases' cfg['sandbox-notice-testcases-run-blurb'] = 'See also the companion subpage for $1 ($2).' cfg['sandbox-notice-testcases-run-link-display'] = 'run' -- cfg['sandbox-category'] -- A category to add to all template sandboxes. cfg['sandbox-category'] = 'Template sandboxes' ---------------------------------------------------------------------------------------------------- -- Start box configuration ---------------------------------------------------------------------------------------------------- -- cfg['documentation-icon-wikitext'] -- The wikitext for the icon shown at the top of the template. cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]' -- cfg['template-namespace-heading'] -- The heading shown in the template namespace. cfg['template-namespace-heading'] = 'Template documentation' -- cfg['module-namespace-heading'] -- The heading shown in the module namespace. cfg['module-namespace-heading'] = 'Module documentation' -- cfg['file-namespace-heading'] -- The heading shown in the file namespace. cfg['file-namespace-heading'] = 'Summary' -- cfg['other-namespaces-heading'] -- The heading shown in other namespaces. cfg['other-namespaces-heading'] = 'Documentation' -- cfg['view-link-display'] -- The text to display for "view" links. cfg['view-link-display'] = 'view' -- cfg['edit-link-display'] -- The text to display for "edit" links. cfg['edit-link-display'] = 'edit' -- cfg['history-link-display'] -- The text to display for "history" links. cfg['history-link-display'] = 'history' -- cfg['purge-link-display'] -- The text to display for "purge" links. cfg['purge-link-display'] = 'purge' -- cfg['create-link-display'] -- The text to display for "create" links. cfg['create-link-display'] = 'create' ---------------------------------------------------------------------------------------------------- -- Link box (end box) configuration ---------------------------------------------------------------------------------------------------- -- cfg['transcluded-from-blurb'] -- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page. cfg['transcluded-from-blurb'] = 'The above [[Wikipedia:Template documentation|documentation]] is [[Help:Transclusion|transcluded]] from $1.' --[[ -- cfg['create-module-doc-blurb'] -- Notice displayed in the module namespace when the documentation subpage does not exist. -- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the -- display cfg['create-link-display']. --]] cfg['create-module-doc-blurb'] = 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].' ---------------------------------------------------------------------------------------------------- -- Experiment blurb configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['experiment-blurb-template'] -- cfg['experiment-blurb-module'] -- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages. -- It is only shown in the template and module namespaces. With the default English settings, it -- might look like this: -- -- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages. -- -- In this example, "sandbox", "edit", "diff", "testcases", and "edit" would all be links. -- -- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending -- on what namespace we are in. -- -- Parameters: -- -- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format: -- -- cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display']) -- -- If the sandbox doesn't exist, it is in the format: -- -- cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display']) -- -- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload'] -- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display'] -- loads a default edit summary of cfg['mirror-edit-summary']. -- -- $2 is a link to the test cases page. If the test cases page exists, it is in the following format: -- -- cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display']) -- -- If the test cases page doesn't exist, it is in the format: -- -- cfg['testcases-link-display'] (cfg['testcases-create-link-display']) -- -- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the -- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current -- namespace. --]] cfg['experiment-blurb-template'] = "Editors can experiment in this template's $1 and $2 pages." cfg['experiment-blurb-module'] = "Editors can experiment in this module's $1 and $2 pages." ---------------------------------------------------------------------------------------------------- -- Sandbox link configuration ---------------------------------------------------------------------------------------------------- -- cfg['sandbox-subpage'] -- The name of the template subpage typically used for sandboxes. cfg['sandbox-subpage'] = 'sandbox' -- cfg['template-sandbox-preload'] -- Preload file for template sandbox pages. cfg['template-sandbox-preload'] = 'Template:Documentation/preload-sandbox' -- cfg['module-sandbox-preload'] -- Preload file for Lua module sandbox pages. cfg['module-sandbox-preload'] = 'Template:Documentation/preload-module-sandbox' -- cfg['sandbox-link-display'] -- The text to display for "sandbox" links. cfg['sandbox-link-display'] = 'sandbox' -- cfg['sandbox-edit-link-display'] -- The text to display for sandbox "edit" links. cfg['sandbox-edit-link-display'] = 'edit' -- cfg['sandbox-create-link-display'] -- The text to display for sandbox "create" links. cfg['sandbox-create-link-display'] = 'create' -- cfg['compare-link-display'] -- The text to display for "compare" links. cfg['compare-link-display'] = 'diff' -- cfg['mirror-edit-summary'] -- The default edit summary to use when a user clicks the "mirror" link. $1 is a wikilink to the -- template page. cfg['mirror-edit-summary'] = 'Create sandbox version of $1' -- cfg['mirror-link-display'] -- The text to display for "mirror" links. cfg['mirror-link-display'] = 'mirror' -- cfg['mirror-link-preload'] -- The page to preload when a user clicks the "mirror" link. cfg['mirror-link-preload'] = 'Template:Documentation/mirror' ---------------------------------------------------------------------------------------------------- -- Test cases link configuration ---------------------------------------------------------------------------------------------------- -- cfg['testcases-subpage'] -- The name of the template subpage typically used for test cases. cfg['testcases-subpage'] = 'testcases' -- cfg['template-testcases-preload'] -- Preload file for template test cases pages. cfg['template-testcases-preload'] = 'Template:Documentation/preload-testcases' -- cfg['module-testcases-preload'] -- Preload file for Lua module test cases pages. cfg['module-testcases-preload'] = 'Template:Documentation/preload-module-testcases' -- cfg['testcases-link-display'] -- The text to display for "testcases" links. cfg['testcases-link-display'] = 'testcases' -- cfg['testcases-edit-link-display'] -- The text to display for test cases "edit" links. cfg['testcases-edit-link-display'] = 'edit' -- cfg['testcases-run-link-display'] -- The text to display for test cases "run" links. cfg['testcases-run-link-display'] = 'run' -- cfg['testcases-create-link-display'] -- The text to display for test cases "create" links. cfg['testcases-create-link-display'] = 'create' ---------------------------------------------------------------------------------------------------- -- Add categories blurb configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['add-categories-blurb'] -- Text to direct users to add categories to the /doc subpage. Not used if the "content" or -- "docname fed" arguments are set, as then it is not clear where to add the categories. $1 is a -- link to the /doc subpage with a display value of cfg['doc-link-display']. --]] cfg['add-categories-blurb'] = 'Add categories to the $1 subpage.' -- cfg['doc-link-display'] -- The text to display when linking to the /doc subpage. cfg['doc-link-display'] = '/doc' ---------------------------------------------------------------------------------------------------- -- Subpages link configuration ---------------------------------------------------------------------------------------------------- --[[ -- cfg['subpages-blurb'] -- The "Subpages of this template" blurb. $1 is a link to the main template's subpages with a -- display value of cfg['subpages-link-display']. In the English version this blurb is simply -- the link followed by a period, and the link display provides the actual text. --]] cfg['subpages-blurb'] = '$1.' --[[ -- cfg['subpages-link-display'] -- The text to display for the "subpages of this page" link. $1 is cfg['template-pagetype'], -- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in -- the template namespace, the module namespace, or another namespace. --]] cfg['subpages-link-display'] = 'Subpages of this $1' -- cfg['template-pagetype'] -- The pagetype to display for template pages. cfg['template-pagetype'] = 'template' -- cfg['module-pagetype'] -- The pagetype to display for Lua module pages. cfg['module-pagetype'] = 'module' -- cfg['default-pagetype'] -- The pagetype to display for pages other than templates or Lua modules. cfg['default-pagetype'] = 'page' ---------------------------------------------------------------------------------------------------- -- Doc link configuration ---------------------------------------------------------------------------------------------------- -- cfg['doc-subpage'] -- The name of the subpage typically used for documentation pages. cfg['doc-subpage'] = 'doc' -- cfg['docpage-preload'] -- Preload file for template documentation pages in all namespaces. cfg['docpage-preload'] = 'Template:Documentation/preload' -- cfg['module-preload'] -- Preload file for Lua module documentation pages. cfg['module-preload'] = 'Template:Documentation/preload-module-doc' ---------------------------------------------------------------------------------------------------- -- HTML and CSS configuration ---------------------------------------------------------------------------------------------------- -- cfg['templatestyles'] -- The name of the TemplateStyles page where CSS is kept. -- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed. cfg['templatestyles'] = 'Module:Documentation/styles.css' -- cfg['container'] -- Class which can be used to set flex or grid CSS on the -- two child divs documentation and documentation-metadata cfg['container'] = 'documentation-container' -- cfg['main-div-classes'] -- Classes added to the main HTML "div" tag. cfg['main-div-classes'] = 'documentation' -- cfg['main-div-heading-class'] -- Class for the main heading for templates and modules and assoc. talk spaces cfg['main-div-heading-class'] = 'documentation-heading' -- cfg['start-box-class'] -- Class for the start box cfg['start-box-class'] = 'documentation-startbox' -- cfg['start-box-link-classes'] -- Classes used for the [view][edit][history] or [create] links in the start box. -- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]] cfg['start-box-link-classes'] = 'mw-editsection-like plainlinks' -- cfg['end-box-class'] -- Class for the end box. cfg['end-box-class'] = 'documentation-metadata' -- cfg['end-box-plainlinks'] -- Plainlinks cfg['end-box-plainlinks'] = 'plainlinks' -- cfg['toolbar-class'] -- Class added for toolbar links. cfg['toolbar-class'] = 'documentation-toolbar' -- cfg['clear'] -- Just used to clear things. cfg['clear'] = 'documentation-clear' ---------------------------------------------------------------------------------------------------- -- Tracking category configuration ---------------------------------------------------------------------------------------------------- -- cfg['display-strange-usage-category'] -- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage -- or a /testcases subpage. This should be a boolean value (either true or false). cfg['display-strange-usage-category'] = true -- cfg['strange-usage-category'] -- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a -- /doc subpage or a /testcases subpage. cfg['strange-usage-category'] = 'Wikipedia pages with strange ((documentation)) usage' --[[ ---------------------------------------------------------------------------------------------------- -- End configuration -- -- Don't edit anything below this line. ---------------------------------------------------------------------------------------------------- --]] return cfg 71b68ed73088f1a59d61acf06bbee9fde6677f03 Module:Documentation/config/doc 828 13 29 2023-10-07T14:09:33Z Silentg 2 Created page with "{{used in system}} {{module rating|protected}} This is the configuration file for [[Module:Documentation]]. This file can be edited to allow easy translation/porting of the module to other wikis." wikitext text/x-wiki {{used in system}} {{module rating|protected}} This is the configuration file for [[Module:Documentation]]. This file can be edited to allow easy translation/porting of the module to other wikis. e6010669e50ed6237542d13cd028b458ec2e21c7 Module:Arguments 828 14 30 2023-10-07T14:11:59Z Silentg 2 Created page with "-- copied from Wikipedia -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val)..." Scribunto text/plain -- copied from Wikipedia -- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly. local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local arguments = {} -- Generate four different tidyVal functions, so that we don't have to check the -- options every time we call it. local function tidyValDefault(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil else return val end else return val end end local function tidyValTrimOnly(key, val) if type(val) == 'string' then return val:match('^%s*(.-)%s*$') else return val end end local function tidyValRemoveBlanksOnly(key, val) if type(val) == 'string' then if val:find('%S') then return val else return nil end else return val end end local function tidyValNoChange(key, val) return val end local function matchesTitle(given, title) local tp = type( given ) return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title end local translate_mt = { __index = function(t, k) return k end } function arguments.getArgs(frame, options) checkType('getArgs', 1, frame, 'table', true) checkType('getArgs', 2, options, 'table', true) frame = frame or {} options = options or {} --[[ -- Set up argument translation. --]] options.translate = options.translate or {} if getmetatable(options.translate) == nil then setmetatable(options.translate, translate_mt) end if options.backtranslate == nil then options.backtranslate = {} for k,v in pairs(options.translate) do options.backtranslate[v] = k end end if options.backtranslate and getmetatable(options.backtranslate) == nil then setmetatable(options.backtranslate, { __index = function(t, k) if options.translate[k] ~= k then return nil else return k end end }) end --[[ -- Get the argument tables. If we were passed a valid frame object, get the -- frame arguments (fargs) and the parent frame arguments (pargs), depending -- on the options set and on the parent frame's availability. If we weren't -- passed a valid frame object, we are being called from another Lua module -- or from the debug console, so assume that we were passed a table of args -- directly, and assign it to a new variable (luaArgs). --]] local fargs, pargs, luaArgs if type(frame.args) == 'table' and type(frame.getParent) == 'function' then if options.wrappers then --[[ -- The wrappers option makes Module:Arguments look up arguments in -- either the frame argument table or the parent argument table, but -- not both. This means that users can use either the #invoke syntax -- or a wrapper template without the loss of performance associated -- with looking arguments up in both the frame and the parent frame. -- Module:Arguments will look up arguments in the parent frame -- if it finds the parent frame's title in options.wrapper; -- otherwise it will look up arguments in the frame object passed -- to getArgs. --]] local parent = frame:getParent() if not parent then fargs = frame.args else local title = parent:getTitle():gsub('/sandbox$', '') local found = false if matchesTitle(options.wrappers, title) then found = true elseif type(options.wrappers) == 'table' then for _,v in pairs(options.wrappers) do if matchesTitle(v, title) then found = true break end end end -- We test for false specifically here so that nil (the default) acts like true. if found or options.frameOnly == false then pargs = parent.args end if not found or options.parentOnly == false then fargs = frame.args end end else -- options.wrapper isn't set, so check the other options. if not options.parentOnly then fargs = frame.args end if not options.frameOnly then local parent = frame:getParent() pargs = parent and parent.args or nil end end if options.parentFirst then fargs, pargs = pargs, fargs end else luaArgs = frame end -- Set the order of precedence of the argument tables. If the variables are -- nil, nothing will be added to the table, which is how we avoid clashes -- between the frame/parent args and the Lua args. local argTables = {fargs} argTables[#argTables + 1] = pargs argTables[#argTables + 1] = luaArgs --[[ -- Generate the tidyVal function. If it has been specified by the user, we -- use that; if not, we choose one of four functions depending on the -- options chosen. This is so that we don't have to call the options table -- every time the function is called. --]] local tidyVal = options.valueFunc if tidyVal then if type(tidyVal) ~= 'function' then error( "bad value assigned to option 'valueFunc'" .. '(function expected, got ' .. type(tidyVal) .. ')', 2 ) end elseif options.trim ~= false then if options.removeBlanks ~= false then tidyVal = tidyValDefault else tidyVal = tidyValTrimOnly end else if options.removeBlanks ~= false then tidyVal = tidyValRemoveBlanksOnly else tidyVal = tidyValNoChange end end --[[ -- Set up the args, metaArgs and nilArgs tables. args will be the one -- accessed from functions, and metaArgs will hold the actual arguments. Nil -- arguments are memoized in nilArgs, and the metatable connects all of them -- together. --]] local args, metaArgs, nilArgs, metatable = {}, {}, {}, {} setmetatable(args, metatable) local function mergeArgs(tables) --[[ -- Accepts multiple tables as input and merges their keys and values -- into one table. If a value is already present it is not overwritten; -- tables listed earlier have precedence. We are also memoizing nil -- values, which can be overwritten if they are 's' (soft). --]] for _, t in ipairs(tables) do for key, val in pairs(t) do if metaArgs[key] == nil and nilArgs[key] ~= 'h' then local tidiedVal = tidyVal(key, val) if tidiedVal == nil then nilArgs[key] = 's' else metaArgs[key] = tidiedVal end end end end end --[[ -- Define metatable behaviour. Arguments are memoized in the metaArgs table, -- and are only fetched from the argument tables once. Fetching arguments -- from the argument tables is the most resource-intensive step in this -- module, so we try and avoid it where possible. For this reason, nil -- arguments are also memoized, in the nilArgs table. Also, we keep a record -- in the metatable of when pairs and ipairs have been called, so we do not -- run pairs and ipairs on the argument tables more than once. We also do -- not run ipairs on fargs and pargs if pairs has already been run, as all -- the arguments will already have been copied over. --]] metatable.__index = function (t, key) --[[ -- Fetches an argument when the args table is indexed. First we check -- to see if the value is memoized, and if not we try and fetch it from -- the argument tables. When we check memoization, we need to check -- metaArgs before nilArgs, as both can be non-nil at the same time. -- If the argument is not present in metaArgs, we also check whether -- pairs has been run yet. If pairs has already been run, we return nil. -- This is because all the arguments will have already been copied into -- metaArgs by the mergeArgs function, meaning that any other arguments -- must be nil. --]] if type(key) == 'string' then key = options.translate[key] end local val = metaArgs[key] if val ~= nil then return val elseif metatable.donePairs or nilArgs[key] then return nil end for _, argTable in ipairs(argTables) do local argTableVal = tidyVal(key, argTable[key]) if argTableVal ~= nil then metaArgs[key] = argTableVal return argTableVal end end nilArgs[key] = 'h' return nil end metatable.__newindex = function (t, key, val) -- This function is called when a module tries to add a new value to the -- args table, or tries to change an existing value. if type(key) == 'string' then key = options.translate[key] end if options.readOnly then error( 'could not write to argument table key "' .. tostring(key) .. '"; the table is read-only', 2 ) elseif options.noOverwrite and args[key] ~= nil then error( 'could not write to argument table key "' .. tostring(key) .. '"; overwriting existing arguments is not permitted', 2 ) elseif val == nil then --[[ -- If the argument is to be overwritten with nil, we need to erase -- the value in metaArgs, so that __index, __pairs and __ipairs do -- not use a previous existing value, if present; and we also need -- to memoize the nil in nilArgs, so that the value isn't looked -- up in the argument tables if it is accessed again. --]] metaArgs[key] = nil nilArgs[key] = 'h' else metaArgs[key] = val end end local function translatenext(invariant) local k, v = next(invariant.t, invariant.k) invariant.k = k if k == nil then return nil elseif type(k) ~= 'string' or not options.backtranslate then return k, v else local backtranslate = options.backtranslate[k] if backtranslate == nil then -- Skip this one. This is a tail call, so this won't cause stack overflow return translatenext(invariant) else return backtranslate, v end end end metatable.__pairs = function () -- Called when pairs is run on the args table. if not metatable.donePairs then mergeArgs(argTables) metatable.donePairs = true end return translatenext, { t = metaArgs } end local function inext(t, i) -- This uses our __index metamethod local v = t[i + 1] if v ~= nil then return i + 1, v end end metatable.__ipairs = function (t) -- Called when ipairs is run on the args table. return inext, t, 0 end return args end return arguments d0445e40a7e608105092c8347d85a72da7fa5a7b Module:Documentation/styles.css 828 15 31 2023-10-07T14:12:59Z Silentg 2 Created page with "/* {{pp|small=yes}} */ .documentation, .documentation-metadata { border: 1px solid #a2a9b1; background-color: #ecfcf4; clear: both; } .documentation { margin: 1em 0 0 0; padding: 1em; } .documentation-metadata { margin: 0.2em 0; /* same margin left-right as .documentation */ font-style: italic; padding: 0.4em 1em; /* same padding left-right as .documentation */ } .documentation-startbox { padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bott..." sanitized-css text/css /* {{pp|small=yes}} */ .documentation, .documentation-metadata { border: 1px solid #a2a9b1; background-color: #ecfcf4; clear: both; } .documentation { margin: 1em 0 0 0; padding: 1em; } .documentation-metadata { margin: 0.2em 0; /* same margin left-right as .documentation */ font-style: italic; padding: 0.4em 1em; /* same padding left-right as .documentation */ } .documentation-startbox { padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bottom: 1ex; } .documentation-heading { font-weight: bold; font-size: 125%; } .documentation-clear { /* Don't want things to stick out where they shouldn't. */ clear: both; } .documentation-toolbar { font-style: normal; font-size: 85%; } ce0e629c92e3d825ab9fd927fe6cc37d9117b6cb Template:Documentation/doc 10 16 32 2023-10-07T14:13:30Z Silentg 2 Created page with "{{used in system}} {{Module rating|protected}} {{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}} {{Uses TemplateStyles|Module:Documentation/styles.css}} This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it. == Normal usage == For most uses, you should use the {{tl|documenta..." wikitext text/x-wiki {{used in system}} {{Module rating|protected}} {{Lua|Module:Documentation/config|Module:Arguments|Module:Message box|Module:Module wikitext|Module:Protection banner}} {{Uses TemplateStyles|Module:Documentation/styles.css}} This module displays a blue box containing documentation for [[Help:Template|templates]], [[Wikipedia:Lua|Lua modules]], or other pages. The {{tl|documentation}} template invokes it. == Normal usage == For most uses, you should use the {{tl|documentation}} template; please see that template's page for its usage instructions and parameters. == Use in other modules == To use this module from another Lua module, first load it with <code>require</code>: <syntaxhighlight lang="lua"> local documentation = require('Module:Documentation').main </syntaxhighlight> Then you can simply call it using a table of arguments. <syntaxhighlight lang="lua"> documentation{content = 'Some documentation', ['link box'] = 'My custom link box'} </syntaxhighlight> Please refer to the [[Template:Documentation/doc|template documentation]] for usage instructions and a list of parameters. == Porting to other wikis == The module has a configuration file at [[Module:Documentation/config]] which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. If you have any questions, or you need a feature which is not currently implemented, please leave a message at <span class="plainlinks">[https://en.wikipedia.org/wiki/Template_talk:Documentation Template talk:Documentation]</span><!-- this link uses external link syntax because it is intended to direct users from third-party wikis to the Wikipedia template talk page; in this situation, an internal link would unhelpfully just point to their local template talk page, and the existence of any given interwiki prefix cannot be assumed --> to get the attention of a developer. The messages that need to be customized to display a documentation template/module at the top of module pages are [[MediaWiki:Scribunto-doc-page-show]] and [[MediaWiki:Scribunto-doc-page-does-not-exist]]. 66a5c1cb6e80e28fd79c6c4544ecf09ced7a6360 Module:Arguments/doc 828 17 33 2023-10-07T14:16:42Z Silentg 2 Created page with "{{Used in system}} {{Module rating|p}} This module provides easy processing of arguments passed from <code>#invoke</code>. It is a meta-module, meant for use by other modules, and should not be called from <code>#invoke</code> directly (for a module directly invocable by templates you might want to have a look at {{ml|params|}}). Its features include: * Easy trimming of arguments and removal of blank arguments. * Arguments can be passed by both the current frame and by..." wikitext text/x-wiki {{Used in system}} {{Module rating|p}} This module provides easy processing of arguments passed from <code>#invoke</code>. It is a meta-module, meant for use by other modules, and should not be called from <code>#invoke</code> directly (for a module directly invocable by templates you might want to have a look at {{ml|params|}}). Its features include: * Easy trimming of arguments and removal of blank arguments. * Arguments can be passed by both the current frame and by the parent frame at the same time. (More details below.) * Arguments can be passed in directly from another Lua module or from the debug console. * Most features can be customized. == Basic use == First, you need to load the module. It contains one function, named <code>getArgs</code>. <syntaxhighlight lang="lua"> local getArgs = require('Module:Arguments').getArgs </syntaxhighlight> In the most basic scenario, you can use getArgs inside your main function. The variable <code>args</code> is a table containing the arguments from #invoke. (See below for details.) <syntaxhighlight lang="lua"> local getArgs = require('Module:Arguments').getArgs local p = {} function p.main(frame) local args = getArgs(frame) -- Main module code goes here. end return p </syntaxhighlight> === Recommended practice === However, the recommended practice is to use a function just for processing arguments from #invoke. This means that if someone calls your module from another Lua module you don't have to have a frame object available, which improves performance. <syntaxhighlight lang="lua"> local getArgs = require('Module:Arguments').getArgs local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) -- Main module code goes here. end return p </syntaxhighlight> The way this is called from a template is <code><nowiki>{{#invoke:Example|main}}</nowiki></code> (optionally with some parameters like <code><nowiki>{{#invoke:Example|main|arg1=value1|arg2=value2}}</nowiki></code>), and the way this is called from a module is <syntaxhighlight lang=lua inline>require('Module:Example')._main({arg1 = 'value1', arg2 = value2, 'spaced arg3' = 'value3'})</syntaxhighlight>. What this second one does is construct a table with the arguments in it, then gives that table to the p._main(args) function, which uses it natively. === Multiple functions === If you want multiple functions to use the arguments, and you also want them to be accessible from #invoke, you can use a wrapper function. <syntaxhighlight lang="lua"> local getArgs = require('Module:Arguments').getArgs local p = {} local function makeInvokeFunc(funcName) return function (frame) local args = getArgs(frame) return p[funcName](args) end end p.func1 = makeInvokeFunc('_func1') function p._func1(args) -- Code for the first function goes here. end p.func2 = makeInvokeFunc('_func2') function p._func2(args) -- Code for the second function goes here. end return p </syntaxhighlight> === Options === The following options are available. They are explained in the sections below. <syntaxhighlight lang="lua"> local args = getArgs(frame, { trim = false, removeBlanks = false, valueFunc = function (key, value) -- Code for processing one argument end, frameOnly = true, parentOnly = true, parentFirst = true, wrappers = { 'Template:A wrapper template', 'Template:Another wrapper template' }, readOnly = true, noOverwrite = true }) </syntaxhighlight> === Trimming and removing blanks === Blank arguments often trip up coders new to converting MediaWiki templates to Lua. In template syntax, blank strings and strings consisting only of whitespace are considered false. However, in Lua, blank strings and strings consisting of whitespace are considered true. This means that if you don't pay attention to such arguments when you write your Lua modules, you might treat something as true that should actually be treated as false. To avoid this, by default this module removes all blank arguments. Similarly, whitespace can cause problems when dealing with positional arguments. Although whitespace is trimmed for named arguments coming from #invoke, it is preserved for positional arguments. Most of the time this additional whitespace is not desired, so this module trims it off by default. However, sometimes you want to use blank arguments as input, and sometimes you want to keep additional whitespace. This can be necessary to convert some templates exactly as they were written. If you want to do this, you can set the <code>trim</code> and <code>removeBlanks</code> arguments to <code>false</code>. <syntaxhighlight lang="lua"> local args = getArgs(frame, { trim = false, removeBlanks = false }) </syntaxhighlight> === Custom formatting of arguments === Sometimes you want to remove some blank arguments but not others, or perhaps you might want to put all of the positional arguments in lower case. To do things like this you can use the <code>valueFunc</code> option. The input to this option must be a function that takes two parameters, <code>key</code> and <code>value</code>, and returns a single value. This value is what you will get when you access the field <code>key</code> in the <code>args</code> table. Example 1: this function preserves whitespace for the first positional argument's value, but trims all other arguments' value and removes all other blank arguments. <syntaxhighlight lang="lua"> local args = getArgs(frame, { valueFunc = function (key, value) if key == 1 then return value elseif value then value = mw.text.trim(value) if value ~= '' then return value end end return nil end }) </syntaxhighlight> Example 2: this function removes blank arguments and converts all argument values to lower case, but doesn't trim whitespace from positional parameters. <syntaxhighlight lang="lua"> local args = getArgs(frame, { valueFunc = function (key, value) if not value then return nil end value = mw.ustring.lower(value) if mw.ustring.find(value, '%S') then return value end return nil end }) </syntaxhighlight> Note: the above functions will fail if passed input that is not of type <code>string</code> or <code>nil</code>. This might be the case if you use the <code>getArgs</code> function in the main function of your module, and that function is called by another Lua module. In this case, you will need to check the type of your input. This is not a problem if you are using a function specially for arguments from #invoke (i.e. you have <code>p.main</code> and <code>p._main</code> functions, or something similar). {{cot|Examples 1 and 2 with type checking}} Example 1: <syntaxhighlight lang="lua"> local args = getArgs(frame, { valueFunc = function (key, value) if key == 1 then return value elseif type(value) == 'string' then value = mw.text.trim(value) if value ~= '' then return value else return nil end else return value end end }) </syntaxhighlight> Example 2: <syntaxhighlight lang="lua"> local args = getArgs(frame, { valueFunc = function (key, value) if type(value) == 'string' then value = mw.ustring.lower(value) if mw.ustring.find(value, '%S') then return value else return nil end else return value end end }) </syntaxhighlight> {{cob}} Also, please note that the <code>valueFunc</code> function is called more or less every time an argument is requested from the <code>args</code> table, so if you care about performance you should make sure you aren't doing anything inefficient with your code. === Frames and parent frames === Arguments in the <code>args</code> table can be passed from the current frame or from its parent frame at the same time. To understand what this means, it is easiest to give an example. Let's say that we have a module called <code>Module:ExampleArgs</code>. This module prints the first two positional arguments that it is passed. {{cot|Module:ExampleArgs code}} <syntaxhighlight lang="lua"> local getArgs = require('Module:Arguments').getArgs local p = {} function p.main(frame) local args = getArgs(frame) return p._main(args) end function p._main(args) local first = args[1] or '' local second = args[2] or '' return first .. ' ' .. second end return p </syntaxhighlight> {{cob}} <code>Module:ExampleArgs</code> is then called by <code>Template:ExampleArgs</code>, which contains the code <code><nowiki>{{#invoke:ExampleArgs|main|firstInvokeArg}}</nowiki></code>. This produces the result "firstInvokeArg". Now if we were to call <code>Template:ExampleArgs</code>, the following would happen: {| class="wikitable" style="width: 50em; max-width: 100%;" |- ! style="width: 60%;" | Code ! style="width: 40%;" | Result |- | <code><nowiki>{{ExampleArgs}}</nowiki></code> | firstInvokeArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code> | firstInvokeArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code> | firstInvokeArg secondTemplateArg |} There are three options you can set to change this behaviour: <code>frameOnly</code>, <code>parentOnly</code> and <code>parentFirst</code>. If you set <code>frameOnly</code> then only arguments passed from the current frame will be accepted; if you set <code>parentOnly</code> then only arguments passed from the parent frame will be accepted; and if you set <code>parentFirst</code> then arguments will be passed from both the current and parent frames, but the parent frame will have priority over the current frame. Here are the results in terms of <code>Template:ExampleArgs</code>: ; frameOnly {| class="wikitable" style="width: 50em; max-width: 100%;" |- ! style="width: 60%;" | Code ! style="width: 40%;" | Result |- | <code><nowiki>{{ExampleArgs}}</nowiki></code> | firstInvokeArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code> | firstInvokeArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code> | firstInvokeArg |} ; parentOnly {| class="wikitable" style="width: 50em; max-width: 100%;" |- ! style="width: 60%;" | Code ! style="width: 40%;" | Result |- | <code><nowiki>{{ExampleArgs}}</nowiki></code> | |- | <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code> | firstTemplateArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code> | firstTemplateArg secondTemplateArg |} ; parentFirst {| class="wikitable" style="width: 50em; max-width: 100%;" |- ! style="width: 60%;" | Code ! style="width: 40%;" | Result |- | <code><nowiki>{{ExampleArgs}}</nowiki></code> | firstInvokeArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg}}</nowiki></code> | firstTemplateArg |- | <code><nowiki>{{ExampleArgs|firstTemplateArg|secondTemplateArg}}</nowiki></code> | firstTemplateArg secondTemplateArg |} Notes: # If you set both the <code>frameOnly</code> and <code>parentOnly</code> options, the module won't fetch any arguments at all from #invoke. This is probably not what you want. # In some situations a parent frame may not be available, e.g. if getArgs is passed the parent frame rather than the current frame. In this case, only the frame arguments will be used (unless parentOnly is set, in which case no arguments will be used) and the <code>parentFirst</code> and <code>frameOnly</code> options will have no effect. === Wrappers === The ''wrappers'' option is used to specify a limited number of templates as ''wrapper templates'', that is, templates whose only purpose is to call a module. If the module detects that it is being called from a wrapper template, it will only check for arguments in the parent frame; otherwise it will only check for arguments in the frame passed to getArgs. This allows modules to be called by either #invoke or through a wrapper template without the loss of performance associated with having to check both the frame and the parent frame for each argument lookup. For example, the only content of [[Template:Side box]] (excluding content in {{tag|noinclude}} tags) is <code><nowiki>{{#invoke:Side box|main}}</nowiki></code>. There is no point in checking the arguments passed directly to the #invoke statement for this template, as no arguments will ever be specified there. We can avoid checking arguments passed to #invoke by using the ''parentOnly'' option, but if we do this then #invoke will not work from other pages either. If this were the case, the {{para|text|Some text}} in the code <code><nowiki>{{#invoke:Side box|main|text=Some text}}</nowiki></code> would be ignored completely, no matter what page it was used from. By using the <code>wrappers</code> option to specify 'Template:Side box' as a wrapper, we can make <code><nowiki>{{#invoke:Side box|main|text=Some text}}</nowiki></code> work from most pages, while still not requiring that the module check for arguments on the [[Template:Side box]] page itself. Wrappers can be specified either as a string, or as an array of strings. <syntaxhighlight lang="lua"> local args = getArgs(frame, { wrappers = 'Template:Wrapper template' }) </syntaxhighlight> <syntaxhighlight lang="lua"> local args = getArgs(frame, { wrappers = { 'Template:Wrapper 1', 'Template:Wrapper 2', -- Any number of wrapper templates can be added here. } }) </syntaxhighlight> Notes: # The module will automatically detect if it is being called from a wrapper template's /sandbox subpage, so there is no need to specify sandbox pages explicitly. # The ''wrappers'' option effectively changes the default of the ''frameOnly'' and ''parentOnly'' options. If, for example, ''parentOnly'' were explicitly set to 0 with ''wrappers'' set, calls via wrapper templates would result in both frame and parent arguments being loaded, though calls not via wrapper templates would result in only frame arguments being loaded. # If the ''wrappers'' option is set and no parent frame is available, the module will always get the arguments from the frame passed to <code>getArgs</code>. === Writing to the args table === Sometimes it can be useful to write new values to the args table. This is possible with the default settings of this module. (However, bear in mind that it is usually better coding style to create a new table with your new values and copy arguments from the args table as needed.) <syntaxhighlight lang="lua"> args.foo = 'some value' </syntaxhighlight> It is possible to alter this behaviour with the <code>readOnly</code> and <code>noOverwrite</code> options. If <code>readOnly</code> is set then it is not possible to write any values to the args table at all. If <code>noOverwrite</code> is set, then it is possible to add new values to the table, but it is not possible to add a value if it would overwrite any arguments that are passed from #invoke. === Ref tags === This module uses [[mw:Extension:Scribunto/Lua reference manual#Metatables|metatables]] to fetch arguments from #invoke. This allows access to both the frame arguments and the parent frame arguments without using the <code>pairs()</code> function. This can help if your module might be passed {{tag|ref}} tags as input. As soon as {{tag|ref}} tags are accessed from Lua, they are processed by the MediaWiki software and the reference will appear in the reference list at the bottom of the article. If your module proceeds to omit the reference tag from the output, you will end up with a phantom reference – a reference that appears in the reference list but without any number linking to it. This has been a problem with modules that use <code>pairs()</code> to detect whether to use the arguments from the frame or the parent frame, as those modules automatically process every available argument. This module solves this problem by allowing access to both frame and parent frame arguments, while still only fetching those arguments when it is necessary. The problem will still occur if you use <code>pairs(args)</code> elsewhere in your module, however. === Known limitations === The use of metatables also has its downsides. Most of the normal Lua table tools won't work properly on the args table, including the <code>#</code> operator, the <code>next()</code> function, and the functions in the table library. If using these is important for your module, you should use your own argument processing function instead of this module.<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| [[Category:Lua metamodules]] }}</includeonly> == See also == * [[Module:Params]] <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Wikipedia utility modules]] }}</includeonly> 894bccd0999d42968144b8976af00501e2ed9ad3 Module:Message box 828 18 34 2023-10-07T14:22:16Z Silentg 2 Created page with "require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions ---------------------------------------------------------------------------..." Scribunto text/plain require('strict') local getArgs local yesno = require('Module:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Module:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end local function union(t1, t2) -- Returns the union of two arrays. local vals = {} for i, v in ipairs(t1) do vals[v] = true end for i, v in ipairs(t2) do vals[v] = true end local ret = {} for k in pairs(vals) do table.insert(ret, k) end table.sort(ret) return ret end local function getArgNums(args, prefix) local nums = {} for k, v in pairs(args) do local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -------------------------------------------------------------------------------- -- Box class definition -------------------------------------------------------------------------------- local MessageBox = {} MessageBox.__index = MessageBox function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {} -- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() -- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if args.demospace and args.demospace ~= '' then -- implement demospace parameter of mbox local demospace = string.lower(args.demospace) if DEMOSPACES[demospace] then -- use template from DEMOSPACES obj.cfg = cfg[DEMOSPACES[demospace]] elseif string.find( demospace, 'talk' ) then -- demo as a talk page obj.cfg = cfg.tmbox else -- default to ombox obj.cfg = cfg.ombox end elseif ns == 0 then obj.cfg = cfg.ambox -- main namespace elseif ns == 6 then obj.cfg = cfg.imbox -- file namespace elseif ns == 14 then obj.cfg = cfg.cmbox -- category namespace else local nsTable = mw.site.namespaces[ns] if nsTable and nsTable.isTalk then obj.cfg = cfg.tmbox -- any talk namespace else obj.cfg = cfg.ombox -- other namespaces or invalid input end end end -- Set the arguments, and remove all blank arguments except for the ones -- listed in cfg.allowBlankParams. do local newArgs = {} for k, v in pairs(args) do if v ~= '' then newArgs[k] = v end end for i, param in ipairs(obj.cfg.allowBlankParams or {}) do newArgs[param] = args[param] end obj.args = newArgs end -- Define internal data structure. obj.categories = {} obj.classes = {} -- For lazy loading of [[Module:Category handler]]. obj.hasCategories = false return setmetatable(obj, MessageBox) end function MessageBox:addCat(ns, cat, sort) if not cat then return nil end if sort then cat = string.format('[[Category:%s|%s]]', cat, sort) else cat = string.format('[[Category:%s]]', cat) end self.hasCategories = true self.categories[ns] = self.categories[ns] or {} table.insert(self.categories[ns], cat) end function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end function MessageBox:setParameters() local args = self.args local cfg = self.cfg -- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image self.typeImageNeedsLink = typeData.imageNeedsLink -- Find if the box has been wrongly substituted. self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' -- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and ( cfg.smallParam and args.small == cfg.smallParam or not cfg.smallParam and yesno(args.small) ) -- Add attributes, classes and styles. self.id = args.id self.name = args.name if self.name then self:addClass('box-' .. string.gsub(self.name,' ','_')) end if yesno(args.plainlinks) ~= false then self:addClass('plainlinks') end for _, class in ipairs(cfg.classes or {}) do self:addClass(class) end if self.isSmall then self:addClass(cfg.smallClass or 'mbox-small') end self:addClass(self.typeClass) self:addClass(args.class) self.style = args.style self.attrs = args.attrs -- Set text style. self.textstyle = args.textstyle -- Find if we are on the template page or not. This functionality is only -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory -- and cfg.templateCategoryRequireName are set. self.useCollapsibleTextFields = cfg.useCollapsibleTextFields if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then if self.name then local templateName = mw.ustring.match( self.name, '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' ) or self.name templateName = 'Template:' .. templateName self.templateTitle = getTitleObject(templateName) end self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) end -- Process data for collapsible text fields. At the moment these are only -- used in {{ambox}}. if self.useCollapsibleTextFields then -- Get the self.issue value. if self.isSmall and args.smalltext then self.issue = args.smalltext else local sect if args.sect == '' then sect = 'This ' .. (cfg.sectionDefault or 'page') elseif type(args.sect) == 'string' then sect = 'This ' .. args.sect end local issue = args.issue issue = type(issue) == 'string' and issue ~= '' and issue or nil local text = args.text text = type(text) == 'string' and text or nil local issues = {} table.insert(issues, sect) table.insert(issues, issue) table.insert(issues, text) self.issue = table.concat(issues, ' ') end -- Get the self.talk value. local talk = args.talk -- Show talk links on the template page or template subpages if the talk -- parameter is blank. if talk == '' and self.templateTitle and ( mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle) ) then talk = '#' elseif talk == '' then talk = nil end if talk then -- If the talk value is a talk page, make a link to that page. Else -- assume that it's a section heading, and make a link to the talk -- page of the current page with that section heading. local talkTitle = getTitleObject(talk) local talkArgIsTalkPage = true if not talkTitle or not talkTitle.isTalkPage then talkArgIsTalkPage = false talkTitle = getTitleObject( self.title.text, mw.site.namespaces[self.title.namespace].talk.id ) end if talkTitle and talkTitle.exists then local talkText if self.isSmall then local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) talkText = string.format('([[%s|talk]])', talkLink) else talkText = 'Relevant discussion may be found on' if talkArgIsTalkPage then talkText = string.format( '%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText ) else talkText = string.format( '%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk ) end end self.talk = talkText end end -- Get other values. self.fix = args.fix ~= '' and args.fix or nil local date if args.date and args.date ~= '' then date = args.date elseif args.date == '' and self.isTemplatePage then date = lang:formatDate('F Y') end if date then self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) end self.info = args.info if yesno(args.removalnotice) then self.removalNotice = cfg.removalNotice end end -- Set the non-collapsible text field. At the moment this is used by all box -- types other than ambox, and also by ambox when small=yes. if self.isSmall then self.text = args.smalltext or args.text else self.text = args.text end -- Set the below row. self.below = cfg.below and args.below -- General image settings. self.imageCellDiv = not self.isSmall and cfg.imageCellDiv self.imageEmptyCell = cfg.imageEmptyCell -- Left image settings. local imageLeft = self.isSmall and args.smallimage or args.image if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none' or not cfg.imageCheckBlank and imageLeft ~= 'none' then self.imageLeft = imageLeft if not imageLeft then local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px' self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" ) end end -- Right image settings. local imageRight = self.isSmall and args.smallimageright or args.imageright if not (cfg.imageRightNone and imageRight == 'none') then self.imageRight = imageRight end -- set templatestyles self.base_templatestyles = cfg.templatestyles self.templatestyles = args.templatestyles end function MessageBox:setMainspaceCategories() local args = self.args local cfg = self.cfg if not cfg.allowMainspaceCategories then return nil end local nums = {} for _, prefix in ipairs{'cat', 'category', 'all'} do args[prefix .. '1'] = args[prefix] nums = union(nums, getArgNums(args, prefix)) end -- The following is roughly equivalent to the old {{Ambox/category}}. local date = args.date date = type(date) == 'string' and date local preposition = 'from' for _, num in ipairs(nums) do local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)] local allCat = args['all' .. tostring(num)] mainCat = type(mainCat) == 'string' and mainCat allCat = type(allCat) == 'string' and allCat if mainCat and date and date ~= '' then local catTitle = string.format('%s %s %s', mainCat, preposition, date) self:addCat(0, catTitle) catTitle = getTitleObject('Category:' .. catTitle) if not catTitle or not catTitle.exists then self:addCat(0, 'Articles with invalid date parameter in template') end elseif mainCat and (not date or date == '') then self:addCat(0, mainCat) end if allCat then self:addCat(0, allCat) end end end function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template categories. if cfg.templateCategory then if cfg.templateCategoryRequireName then if self.isTemplatePage then self:addCat(10, cfg.templateCategory) end elseif not self.title.isSubpage then self:addCat(10, cfg.templateCategory) end end -- Add template error categories. if cfg.templateErrorCategory then local templateErrorCategory = cfg.templateErrorCategory local templateCat, templateSort if not self.name and not self.title.isSubpage then templateCat = templateErrorCategory elseif self.isTemplatePage then local paramsToCheck = cfg.templateErrorParamsToCheck or {} local count = 0 for i, param in ipairs(paramsToCheck) do if not args[param] then count = count + 1 end end if count > 0 then templateCat = templateErrorCategory templateSort = tostring(count) end if self.categoryNums and #self.categoryNums > 0 then templateCat = templateErrorCategory templateSort = 'C' end end self:addCat(10, templateCat, templateSort) end end function MessageBox:setAllNamespaceCategories() -- Set categories for all namespaces. if self.invalidTypeError then local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) end if self.isSubstituted then self:addCat('all', 'Pages with incorrectly substituted templates') end end function MessageBox:setCategories() if self.title.namespace == 0 then self:setMainspaceCategories() elseif self.title.namespace == 10 then self:setTemplateCategories() end self:setAllNamespaceCategories() end function MessageBox:renderCategories() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. return require('Module:Category handler')._main{ main = table.concat(self.categories[0] or {}), template = table.concat(self.categories[10] or {}), all = table.concat(self.categories.all or {}), nocat = self.args.nocat, page = self.args.page } end function MessageBox:export() local root = mw.html.create() -- Add the subst check error. if self.isSubstituted and self.name then root:tag('b') :addClass('error') :wikitext(string.format( 'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') )) end local frame = mw.getCurrentFrame() root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.base_templatestyles }, }) -- Add support for a single custom templatestyles sheet. Undocumented as -- need should be limited and many templates using mbox are substed; we -- don't want to spread templatestyles sheets around to arbitrary places if self.templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = self.templatestyles }, }) end -- Create the box table. local boxTable = root:tag('table') boxTable:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do boxTable:addClass(class or nil) end boxTable :cssText(self.style or nil) :attr('role', 'presentation') if self.attrs then boxTable:attr(self.attrs) end -- Add the left-hand image. local row = boxTable:tag('tr') if self.imageLeft then local imageLeftCell = row:tag('td'):addClass('mbox-image') if self.imageCellDiv then -- If we are using a div, redefine imageLeftCell so that the image -- is inside it. Divs use style="width: 52px;", which limits the -- image width to 52px. If any images in a div are wider than that, -- they may overlap with the text or cause other display problems. imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') end imageLeftCell:wikitext(self.imageLeft or nil) elseif self.imageEmptyCell then -- Some message boxes define an empty cell if no image is specified, and -- some don't. The old template code in templates where empty cells are -- specified gives the following hint: "No image. Cell with some width -- or padding necessary for text cell to have 100% width." row:tag('td') :addClass('mbox-empty-cell') end -- Add the text. local textCell = row:tag('td'):addClass('mbox-text') if self.useCollapsibleTextFields then -- The message box uses advanced text parameters that allow things to be -- collapsible. At the moment, only ambox uses this. textCell:cssText(self.textstyle or nil) local textCellDiv = textCell:tag('div') textCellDiv :addClass('mbox-text-span') :wikitext(self.issue or nil) if (self.talk or self.fix) then textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil) end textCellDiv:wikitext(self.date and (' ' .. self.date) or nil) if self.info and not self.isSmall then textCellDiv :tag('span') :addClass('hide-when-compact') :wikitext(self.info and (' ' .. self.info) or nil) end if self.removalNotice then textCellDiv:tag('span') :addClass('hide-when-compact') :tag('i') :wikitext(string.format(" (%s)", self.removalNotice)) end else -- Default text formatting - anything goes. textCell :cssText(self.textstyle or nil) :wikitext(self.text or nil) end -- Add the right-hand image. if self.imageRight then local imageRightCell = row:tag('td'):addClass('mbox-imageright') if self.imageCellDiv then -- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') end imageRightCell :wikitext(self.imageRight or nil) end -- Add the below row. if self.below then boxTable:tag('tr') :tag('td') :attr('colspan', self.imageRight and '3' or '2') :addClass('mbox-text') :cssText(self.textstyle or nil) :wikitext(self.below or nil) end -- Add error message for invalid type parameters. if self.invalidTypeError then root:tag('div') :addClass('mbox-invalid-type') :wikitext(string.format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or '' )) end -- Add categories. root:wikitext(self:renderCategories() or nil) return tostring(root) end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p, mt = {}, {} function p._exportClasses() -- For testing. return { MessageBox = MessageBox } end function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export() end function mt.__index(t, k) return function (frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return t.main(k, getArgs(frame, {trim = false, removeBlanks = false})) end end return setmetatable(p, mt) f2fb84f7b817d2d88747f57c40902a0d8be8158a Module:Message box/doc 828 19 35 2023-10-07T14:22:49Z Silentg 2 Created page with "{{Used in system}} {{module rating|p}} {{Lua|Module:Message box/configuration|Module:Yesno|Module:Arguments|Module:Category handler}} {{Uses TemplateStyles|Module:Message box/ambox.css|Module:Message box/cmbox.css|Module:Message box/fmbox.css|Module:Message box/imbox.css|Module:Message box/ombox.css|Module:Message box/tmbox.css}} This is a meta-module that implements the message box templates {{tl|mbox}}, {{tl|ambox}}, {{tl|cmbox}}, {{tl|fmbox}}, {{tl|imbox}}, {{tl|ombo..." wikitext text/x-wiki {{Used in system}} {{module rating|p}} {{Lua|Module:Message box/configuration|Module:Yesno|Module:Arguments|Module:Category handler}} {{Uses TemplateStyles|Module:Message box/ambox.css|Module:Message box/cmbox.css|Module:Message box/fmbox.css|Module:Message box/imbox.css|Module:Message box/ombox.css|Module:Message box/tmbox.css}} This is a meta-module that implements the message box templates {{tl|mbox}}, {{tl|ambox}}, {{tl|cmbox}}, {{tl|fmbox}}, {{tl|imbox}}, {{tl|ombox}}, and {{tl|tmbox}}. It is intended to be used from Lua modules, and should not be used directly from wiki pages. If you want to use this module's functionality from a wiki page, please use the individual message box templates instead. == Usage == To use this module from another Lua module, first you need to load it. <syntaxhighlight lang="lua"> local messageBox = require('Module:Message box') </syntaxhighlight> To create a message box, use the <code>main</code> function. It takes two parameters: the first is the box type (as a string), and the second is a table containing the message box parameters. <syntaxhighlight lang="lua"> local box = messageBox.main( boxType, { param1 = param1, param2 = param2, -- More parameters... }) </syntaxhighlight> There are seven available box types: {| class="wikitable" ! Box type !! Template !! Purpose |- | <code>mbox</code> || {{tl|mbox}} || For message boxes to be used in multiple namespaces |- | <code>ambox</code> || {{tl|ambox}} || For article message boxes |- | <code>cmbox</code> || {{tl|cmbox}} || For category message boxes |- | <code>fmbox</code> || {{tl|fmbox}} || For interface message boxes |- | <code>imbox</code> || {{tl|imbox}} || For file namespace message boxes |- | <code>tmbox</code> || {{tl|tmbox}} || For talk page message boxes |- | <code>ombox</code> || {{tl|ombox}} || For message boxes in other namespaces |} See the template page of each box type for the available parameters. == Usage from #invoke == As well as the <code>main</code> function, this module has separate functions for each box type. They are accessed using the code <code><nowiki>{{#invoke:Message box|mbox|...}}</nowiki></code>, <code><nowiki>{{#invoke:Message box|ambox|...}}</nowiki></code>, etc. These will work when called from other modules, but they access code used to process arguments passed from #invoke, and so calling them will be less efficient than calling <code>main</code>. == Technical details == The module uses the same basic code for each of the templates listed above; the differences between each of them are configured using the data at [[Module:Message box/configuration]]. Here are the various configuration options and what they mean: * <code>types</code> – a table containing data used by the type parameter of the message box. The table keys are the values that can be passed to the type parameter, and the table values are tables containing the class and the image used by that type. * <code>default</code> – the type to use if no value was passed to the type parameter, or if an invalid value was specified. * <code>showInvalidTypeError</code> – whether to show an error if the value passed to the type parameter was invalid. * <code>allowBlankParams</code> – usually blank values are stripped from parameters passed to the module. However, whitespace is preserved for the parameters included in the allowBlankParams table. * <code>allowSmall</code> – whether a small version of the message box can be produced with "small=yes". * <code>smallParam</code> – a custom name for the small parameter. For example, if set to "left" you can produce a small message box using "small=left". * <code>smallClass</code> – the class to use for small message boxes. * <code>substCheck</code> – whether to perform a subst check or not. * <code>classes</code> – an array of classes to use with the message box. * <code>imageEmptyCell</code> – whether to use an empty {{tag|td}} cell if there is no image set. This is used to preserve spacing for message boxes with a width of less than 100% of the screen. * <code>imageEmptyCellStyle</code> – whether empty image cells should be styled. * <code>imageCheckBlank</code> – whether "image=blank" results in no image being displayed. * <code>imageSmallSize</code> – usually, images used in small message boxes are set to 30x30px. This sets a custom size. * <code>imageCellDiv</code> – whether to enclose the image in a div enforcing a maximum image size. * <code>useCollapsibleTextFields</code> – whether to use text fields that can be collapsed, i.e. "issue", "fix", "talk", etc. Currently only used in ambox. * <code>imageRightNone</code> – whether imageright=none results in no image being displayed on the right-hand side of the message box. * <code>sectionDefault</code> – the default name for the "section" parameter. Depends on <code>useCollapsibleTextFields</code>. * <code>allowMainspaceCategories</code> – allow categorisation in the main namespace. * <code>templateCategory</code> – the name of a category to be placed on the template page. * <code>templateCategoryRequireName</code> – whether the <code>name</code> parameter is required to display the template category. * <code>templateErrorCategory</code> – the name of the error category to be used on the template page. * <code>templateErrorParamsToCheck</code> – an array of parameter names to check. If any are absent, the <code>templateErrorCategory</code> is applied to the template page. fd6bb8dc654a1b8bb0a0f771130e9b2b5a5c05ad Module:Message box/configuration 828 20 36 2023-10-07T14:24:57Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-spee..." Scribunto text/plain -------------------------------------------------------------------------------- -- Message box configuration -- -- -- -- This module contains configuration data for [[Module:Message box]]. -- -------------------------------------------------------------------------------- return { ambox = { types = { speedy = { class = 'ambox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ambox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ambox-content', image = 'Ambox important.svg' }, style = { class = 'ambox-style', image = 'Edit-clear.svg' }, move = { class = 'ambox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ambox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ambox-notice', image = 'Information icon4.svg' } }, default = 'notice', allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'}, allowSmall = true, smallParam = 'left', smallClass = 'mbox-small-left', substCheck = true, classes = {'metadata', 'ambox'}, imageEmptyCell = true, imageCheckBlank = true, imageSmallSize = '20x20px', imageCellDiv = true, useCollapsibleTextFields = true, imageRightNone = true, sectionDefault = 'article', allowMainspaceCategories = true, templateCategory = 'Article message templates', templateCategoryRequireName = true, templateErrorCategory = 'Article message templates with missing parameters', templateErrorParamsToCheck = {'issue', 'fix', 'subst'}, removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>', templatestyles = 'Module:Message box/ambox.css' }, cmbox = { types = { speedy = { class = 'cmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'cmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'cmbox-content', image = 'Ambox important.svg' }, style = { class = 'cmbox-style', image = 'Edit-clear.svg' }, move = { class = 'cmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'cmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'cmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'cmbox'}, imageEmptyCell = true, templatestyles = 'Module:Message box/cmbox.css' }, fmbox = { types = { warning = { class = 'fmbox-warning', image = 'Ambox warning pn.svg' }, editnotice = { class = 'fmbox-editnotice', image = 'Information icon4.svg' }, system = { class = 'fmbox-system', image = 'Information icon4.svg' } }, default = 'system', showInvalidTypeError = true, classes = {'fmbox'}, imageEmptyCell = false, imageRightNone = false, templatestyles = 'Module:Message box/fmbox.css' }, imbox = { types = { speedy = { class = 'imbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'imbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'imbox-content', image = 'Ambox important.svg' }, style = { class = 'imbox-style', image = 'Edit-clear.svg' }, move = { class = 'imbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'imbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, license = { class = 'imbox-license licensetpl', image = 'Imbox-license.svg' }, featured = { class = 'imbox-featured', image = 'Cscr-featured.svg', imageNeedsLink = true }, notice = { class = 'imbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'imbox'}, imageEmptyCell = true, below = true, templateCategory = 'File message boxes', templatestyles = 'Module:Message box/imbox.css' }, ombox = { types = { speedy = { class = 'ombox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'ombox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'ombox-content', image = 'Ambox important.svg' }, style = { class = 'ombox-style', image = 'Edit-clear.svg' }, move = { class = 'ombox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'ombox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'ombox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'ombox'}, allowSmall = true, imageEmptyCell = true, imageRightNone = true, templatestyles = 'Module:Message box/ombox.css' }, tmbox = { types = { speedy = { class = 'tmbox-speedy', image = 'Ambox warning pn.svg' }, delete = { class = 'tmbox-delete', image = 'Ambox warning pn.svg' }, content = { class = 'tmbox-content', image = 'Ambox important.svg' }, style = { class = 'tmbox-style', image = 'Edit-clear.svg' }, move = { class = 'tmbox-move', image = 'Merge-split-transwiki default.svg' }, protection = { class = 'tmbox-protection', image = 'Semi-protection-shackle-keyhole.svg' }, notice = { class = 'tmbox-notice', image = 'Information icon4.svg' } }, default = 'notice', showInvalidTypeError = true, classes = {'tmbox'}, allowSmall = true, imageRightNone = true, imageEmptyCell = true, templateCategory = 'Talk message boxes', templatestyles = 'Module:Message box/tmbox.css' } } 27f00af5cf3939613e9156acd5e62a3469d03d81 Module:Message box/configuration/doc 828 21 37 2023-10-07T14:25:41Z Silentg 2 Created page with "{{Used in system}} {{Module rating|protected}} Configuration for [[Module:Message box]]." wikitext text/x-wiki {{Used in system}} {{Module rating|protected}} Configuration for [[Module:Message box]]. ffb793a2e927e8589f3a9b2cc287b2d4584e7afb Module:Yesno 828 22 38 2023-10-07T14:27:09Z Silentg 2 Created page with "-- copied from Wikipedia -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes'..." Scribunto text/plain -- copied from Wikipedia -- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}. return function (val, default) -- If your wiki uses non-ascii characters for any of "yes", "no", etc., you -- should replace "val:lower()" with "mw.ustring.lower(val)" in the -- following line. val = type(val) == 'string' and val:lower() or val if val == nil then return nil elseif val == true or val == 'yes' or val == 'y' or val == 'true' or val == 't' or val == 'on' or tonumber(val) == 1 then return true elseif val == false or val == 'no' or val == 'n' or val == 'false' or val == 'f' or val == 'off' or tonumber(val) == 0 then return false else return default end end 995ccb729f43738066a34916a2ca9ad51267d3c8 Module:Yesno/doc 828 23 39 2023-10-07T14:27:38Z Silentg 2 Created page with "{{used in system}} {{Module rating|protected}} This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "yes", "no", etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns <code>nil</code> values as <code>nil</code>,..." wikitext text/x-wiki {{used in system}} {{Module rating|protected}} This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the <code>true</code> and <code>false</code> boolean values, wikicode templates can only express boolean values through strings such as "yes", "no", etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns <code>nil</code> values as <code>nil</code>, to allow for distinctions between <code>nil</code> and <code>false</code>. The module also accepts other Lua structures as input, i.e. booleans, numbers, tables, and functions. If it is passed input that it does not recognise as boolean or <code>nil</code>, it is possible to specify a default value to return. == Syntax == <syntaxhighlight lang="lua">yesno(value, default)</syntaxhighlight> <code>value</code> is the value to be tested. Boolean input or boolean-style input (see below) always evaluates to either <code>true</code> or <code>false</code>, and <code>nil</code> always evaluates to <code>nil</code>. Other values evaluate to <code>default</code>. == Usage == First, load the module. Note that it can only be loaded from other Lua modules, not from normal wiki pages. For normal wiki pages you can use {{tl|yesno}} instead. <syntaxhighlight lang="lua"> local yesno = require('Module:Yesno') </syntaxhighlight> Some input values always return <code>true</code>, and some always return <code>false</code>. <code>nil</code> values always return <code>nil</code>. <syntaxhighlight lang="lua"> -- These always return true: yesno('yes') yesno('y') yesno('true') yesno('t') yesno('on') yesno('1') yesno(1) yesno(true) -- These always return false: yesno('no') yesno('n') yesno('false') yesno('f') yesno('off') yesno('0') yesno(0) yesno(false) -- A nil value always returns nil: yesno(nil) yesno() </syntaxhighlight> String values are converted to lower case before they are matched: <syntaxhighlight lang="lua"> -- These always return true: yesno('Yes') yesno('YES') yesno('yEs') yesno('Y') yesno('tRuE') -- These always return false: yesno('No') yesno('NO') yesno('nO') yesno('N') yesno('fALsE') </syntaxhighlight> ===Undefined input ('foo')=== You can specify a default value if yesno receives input other than that listed above. If you don't supply a default, the module will return <code>nil</code> for these inputs. <syntaxhighlight lang="lua"> -- These return nil: yesno(nil) yesno('foo') yesno({}) yesno(5) yesno('') yesno(function() return 'This is a function.' end) yesno(nil, true) yesno(nil, 'bar') -- These return true: yesno('foo', true) yesno({}, true) yesno(5, true) yesno('', true) yesno(function() return 'This is a function.' end, true) -- These return "bar": yesno('foo', 'bar') yesno({}, 'bar') yesno(5, 'bar') yesno('', 'bar') yesno(function() return 'This is a function.' end, 'bar') </syntaxhighlight> Although the empty string usually evaluates to false in wikitext, it evaluates to true in Lua. This module prefers the Lua behaviour over the wikitext behaviour. If treating the empty string as false is important for your module, you will need to convert empty strings to a value that evaluates to false before passing them to this module. In the case of arguments received from wikitext, this can be done by using [[Module:Arguments]]. ===Handling nil results=== By definition :<syntaxhighlight lang="lua"> yesno(nil) -- Returns nil. yesno('foo') -- Returns nil. yesno(nil, true) -- Returns nil. yesno(nil, false) -- Returns nil. yesno('foo', true) -- Returns true. </syntaxhighlight> To get the binary <syntaxhighlight lang="lua" inline>true/false</syntaxhighlight>-only values, use code like: <syntaxhighlight lang="lua"> myvariable = yesno(value or false) -- When value is nil, result is false. myvariable = yesno(value or true) -- When value is nil, result is true. myvariable = yesno('foo') or false -- Unknown string returns nil, result is false. myvariable = yesno('foo', true) or false -- Default value (here: true) applies, result is true. </syntaxhighlight><!-- --><includeonly>{{sandbox other|| [[Category:Lua metamodules]] }}</includeonly> acae88c54e953bbad689f511129b3d5bbf0364f3 Module:Category handler 828 24 40 2023-10-07T14:29:50Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace alia..." Scribunto text/plain -------------------------------------------------------------------------------- -- -- -- CATEGORY HANDLER -- -- -- -- This module implements the {{category handler}} template in Lua, -- -- with a few improvements: all namespaces and all namespace aliases -- -- are supported, and namespace names are detected automatically for -- -- the local wiki. This module requires [[Module:Namespace detect]] -- -- and [[Module:Yesno]] to be available on the local wiki. It can be -- -- configured for different wikis by altering the values in -- -- [[Module:Category handler/config]], and pages can be blacklisted -- -- from categorisation by using [[Module:Category handler/blacklist]]. -- -- -- -------------------------------------------------------------------------------- -- Load required modules local yesno = require('Module:Yesno') -- Lazily load things we don't always need local mShared, mappings local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function trimWhitespace(s, removeBlanks) if type(s) ~= 'string' then return s end s = s:match('^%s*(.-)%s*$') if removeBlanks then if s ~= '' then return s else return nil end else return s end end -------------------------------------------------------------------------------- -- CategoryHandler class -------------------------------------------------------------------------------- local CategoryHandler = {} CategoryHandler.__index = CategoryHandler function CategoryHandler.new(data, args) local obj = setmetatable({ _data = data, _args = args }, CategoryHandler) -- Set the title object do local pagename = obj:parameter('demopage') local success, titleObj if pagename then success, titleObj = pcall(mw.title.new, pagename) end if success and titleObj then obj.title = titleObj if titleObj == mw.title.getCurrentTitle() then obj._usesCurrentTitle = true end else obj.title = mw.title.getCurrentTitle() obj._usesCurrentTitle = true end end -- Set suppression parameter values for _, key in ipairs{'nocat', 'categories'} do local value = obj:parameter(key) value = trimWhitespace(value, true) obj['_' .. key] = yesno(value) end do local subpage = obj:parameter('subpage') local category2 = obj:parameter('category2') if type(subpage) == 'string' then subpage = mw.ustring.lower(subpage) end if type(category2) == 'string' then subpage = mw.ustring.lower(category2) end obj._subpage = trimWhitespace(subpage, true) obj._category2 = trimWhitespace(category2) -- don't remove blank values end return obj end function CategoryHandler:parameter(key) local parameterNames = self._data.parameters[key] local pntype = type(parameterNames) if pntype == 'string' or pntype == 'number' then return self._args[parameterNames] elseif pntype == 'table' then for _, name in ipairs(parameterNames) do local value = self._args[name] if value ~= nil then return value end end return nil else error(string.format( 'invalid config key "%s"', tostring(key) ), 2) end end function CategoryHandler:isSuppressedByArguments() return -- See if a category suppression argument has been set. self._nocat == true or self._categories == false or ( self._category2 and self._category2 ~= self._data.category2Yes and self._category2 ~= self._data.category2Negative ) -- Check whether we are on a subpage, and see if categories are -- suppressed based on our subpage status. or self._subpage == self._data.subpageNo and self.title.isSubpage or self._subpage == self._data.subpageOnly and not self.title.isSubpage end function CategoryHandler:shouldSkipBlacklistCheck() -- Check whether the category suppression arguments indicate we -- should skip the blacklist check. return self._nocat == false or self._categories == true or self._category2 == self._data.category2Yes end function CategoryHandler:matchesBlacklist() if self._usesCurrentTitle then return self._data.currentTitleMatchesBlacklist else mShared = mShared or require('Module:Category handler/shared') return mShared.matchesBlacklist( self.title.prefixedText, mw.loadData('Module:Category handler/blacklist') ) end end function CategoryHandler:isSuppressed() -- Find if categories are suppressed by either the arguments or by -- matching the blacklist. return self:isSuppressedByArguments() or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist() end function CategoryHandler:getNamespaceParameters() if self._usesCurrentTitle then return self._data.currentTitleNamespaceParameters else if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end return mShared.getNamespaceParameters( self.title, mappings ) end end function CategoryHandler:namespaceParametersExist() -- Find whether any namespace parameters have been specified. -- We use the order "all" --> namespace params --> "other" as this is what -- the old template did. if self:parameter('all') then return true end if not mappings then mShared = mShared or require('Module:Category handler/shared') mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData end for ns, params in pairs(mappings) do for i, param in ipairs(params) do if self._args[param] then return true end end end if self:parameter('other') then return true end return false end function CategoryHandler:getCategories() local params = self:getNamespaceParameters() local nsCategory for i, param in ipairs(params) do local value = self._args[param] if value ~= nil then nsCategory = value break end end if nsCategory ~= nil or self:namespaceParametersExist() then -- Namespace parameters exist - advanced usage. if nsCategory == nil then nsCategory = self:parameter('other') end local ret = {self:parameter('all')} local numParam = tonumber(nsCategory) if numParam and numParam >= 1 and math.floor(numParam) == numParam then -- nsCategory is an integer ret[#ret + 1] = self._args[numParam] else ret[#ret + 1] = nsCategory end if #ret < 1 then return nil else return table.concat(ret) end elseif self._data.defaultNamespaces[self.title.namespace] then -- Namespace parameters don't exist, simple usage. return self._args[1] end return nil end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- Used for testing purposes. return { CategoryHandler = CategoryHandler } end function p._main(args, data) data = data or mw.loadData('Module:Category handler/data') local handler = CategoryHandler.new(data, args) if handler:isSuppressed() then return nil end return handler:getCategories() end function p.main(frame, data) data = data or mw.loadData('Module:Category handler/data') local args = require('Module:Arguments').getArgs(frame, { wrappers = data.wrappers, valueFunc = function (k, v) v = trimWhitespace(v) if type(k) == 'number' then if v ~= '' then return v else return nil end else return v end end }) return p._main(args, data) end return p b74dd63857b24904ac452429b11213f18647471f Module:Category handler/doc 828 25 41 2023-10-07T14:30:13Z Silentg 2 Created page with "{{Used in system}} {{Module rating|p}} {{Lua|Module:Category handler/data|Module:Category handler/shared|Module:Category handler/blacklist|Module:Yesno|Module:Arguments}} This module implements the {{tl|category handler}} template. The category handler template helps other templates to automate both categorization and [[Wikipedia:Category suppression|category suppression]]. For information about using the category handler template in other templates, please see the '''[..." wikitext text/x-wiki {{Used in system}} {{Module rating|p}} {{Lua|Module:Category handler/data|Module:Category handler/shared|Module:Category handler/blacklist|Module:Yesno|Module:Arguments}} This module implements the {{tl|category handler}} template. The category handler template helps other templates to automate both categorization and [[Wikipedia:Category suppression|category suppression]]. For information about using the category handler template in other templates, please see the '''[[Template:Category handler|template documentation]]'''. Keep reading for information about using the category handler module in other Lua modules, or for information on exporting this module to other wikis. == Use from other Lua modules == === When not to use this module === For cases where a module only needs to categorise in one of the namespaces main (articles), file (images) or category, then using this module is overkill. Instead, you can simply get a title object using [[mw:Extension:Scribunto/Lua reference manual#mw.title.getCurrentTitle|mw.title.getCurrentTitle]] and check the <code>nsText</code> field. For example: <syntaxhighlight lang="lua"> local title = mw.title.getCurrentTitle() if title.nsText == 'File' then -- do something end </syntaxhighlight> However, if your module needs to categorize in any other namespace, then we recommend you use this module, since it provides proper category suppression and makes it easy to select how to categorize in the different namespaces. === Namespaces === This module detects and groups all the different [[Wikipedia:Namespace|namespaces]] used on Wikipedia into several types. These types are used as parameter names in this module. :'''main''' = Main/article space, as in normal Wikipedia articles. :'''talk''' = Any talk space, such as page names that start with "Talk:", "User talk:", "File talk:" and so on. :'''user, wikipedia, file ... = The other namespaces except the talk pages. Namespace aliases are also accepted. See the table below for the full list.''' :'''other''' = Any namespaces that were not specified as a parameter to the template. See examples below. ;List of possible namespace parameters (excluding <code>''talk''</code> and <code>''other''</code>) {{#invoke:Namespace detect|table}} === Basic usage === This module takes two or more parameters. Here's an example using a hello world program: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'Hello world!' local category = categoryHandler{ '[[Category:Somecat]]', nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> The above example uses the default settings for the category handler module. That means the example module will categorize on pages in the following namespaces: :'''main''', '''file''', '''help''', '''category''', '''portal''' and '''book''' But it will ''not'' categorize in any other namespaces, e.g.: :'''talk''', '''user''', '''wikipedia''', '''mediawiki''', '''template''' ... And it will ''not'' categorize on blacklisted pages. (See section [[#Blacklist|blacklist]] below.) The reason the category handler module does not categorize in some of the namespaces is that in those namespaces most modules and templates are just demonstrated or listed, not used. Thus most modules and templates should not categorize in those namespaces. Any module or template that is meant for one or more of the namespaces where this module categorizes can use the basic syntax as shown above. === Advanced usage === This module takes one or more parameters named after the different page types as listed in section [[#Namespaces|namespaces]] above. By using those parameters you can specify exactly in which namespaces your template should categorize. Like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module meant for articles and talk pages.' local category = categoryHandler{ main = '[[Category:Somecat1]]', -- Categorize in main (article) space talk = '[[Category:Somecat2]]', -- Categorize in talk space nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> The above module will only categorize in main and talk space. But it will not categorize on /archive pages since they are blacklisted. (See section [[#Blacklist|blacklist]] below.) And if you need to demonstrate (discuss) the module on a talkpage, then you can feed "<code>nocat='true'</code>" to prevent that template from categorizing. (See section [[#Nocat|nocat]] below.) Like this: <pre> == My new module == Hey guys, have you seen my new module? {{#invoke:mymodule|main|nocat=true}} Nice, isn't it? --~~~~ </pre> Sometimes we want to use the same category in several namespaces, then do like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module used in several namespaces.' local category = categoryHandler{ main = '[[Category:Somecat1]]', [ 1 ] = '[[Category:Somecat2]]', -- For help and user space help = 1, user = 1, talk = '', -- No categories on talk pages other = '[[Category:Somecat3]]', -- For all other namespaces nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> In the above example we use a numbered parameter to feed one of the categories, and then we tell this module to use that numbered parameter for both the help and user space. The category handler module understands an unlimited number of numbered parameters. The '''other''' parameter defines what should be used in the remaining namespaces that have not explicitly been fed data. Note the empty but defined '''talk''' parameter. That stops this module from showing what has been fed to the '''other''' parameter, when in talk space. The category handler module also has a parameter called '''all'''. It works like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module used in all namespaces.' local category = categoryHandler{ all = '[[Category:Somecat1]]', -- Categorize in all namespaces nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> The above example will categorize in all namespaces, but not on blacklisted pages. If you want to demonstrate that module on a page, then use "<code>nocat=true</code>" to prevent the template from categorizing. We suggest avoiding the '''all''' parameter, since modules and templates should preferably only categorize in the namespaces they need to. The all parameter can also be combined with the rest of the parameters. Like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module used in all namespaces.' local category = categoryHandler{ all = '[[Category:Somecat1]]', -- Categorize in all namespaces main = '[[Category:Somecat2]]', -- And add this in main space other = '[[Category:Somecat3]]', -- And add this in all other namespaces nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> If the above module is placed on an article, then it will add the categories "Somecat1" and "Somecat2". But on all other types of pages it will instead add "Somecat1" and "Somecat3". As the example shows, the all parameter works independently of the rest of the parameters. === Subpages === The category handler module understands the '''subpage''' parameter. Like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module used in all namespaces.' local category = categoryHandler{ subpage = 'no' -- Don't categorize on subpages wikipedia = '[[Category:Somecat]]', nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> If "<code>subpage='no'</code>" then this template will ''not'' categorize on subpages. For the rare occasion you ''only'' want to categorize on subpages, then use "<code>subpage='only'</code>". If '''subpage''' is empty or undefined then this template categorizes both on basepages and on subpages. === Blacklist === This module has a blacklist of the pages and page types where templates should not auto-categorize. Thus modules that use this meta-template will for instance not categorize on /archive pages and on the subpages of [[Wikipedia:Template messages]]. If you want a template to categorize on a blacklisted page, then feed "<code><nowiki>nocat = false</nowiki></code>" to the module when you place it on the page, thus skipping the blacklist check. Note that this module only categorizes if it has data for the namespace. For instance, if the basic syntax is used (see [[#Basic usage|basic usage]] above), then even if you set "<code>nocat = false</code>" the template will not categorize on a talk page, since it has no data for talk pages. But it has data for help space, so on a blacklisted help page it will categorize. The blacklist is located in the configuration table <code>cfg.blacklist</code> near the top of the module code. === The "nocat" parameter === This module understands the '''nocat''' parameter: * If "<code>nocat = true</code>" then this template does ''not'' categorize. * If '''nocat''' is <code>nil</code> then this template categorizes as usual. * If "<code>nocat = false</code>" this template categorizes even when on blacklisted pages. (See section [[#Blacklist|blacklist]] above.) * The nocat parameter also accepts aliases for <code>true</code> and <code>false</code> as defined by [[Module:Yesno]], e.g. "yes", "y", "true", and 1 for <code>true</code>, and "no", "n", "false", and 0 for <code>false</code>. Modules and templates that use {{tlf|category handler}} should forward '''nocat''', so they too understand '''nocat'''. The code "<code>nocat = frame.args.nocat</code>" shown in the examples on this page does that. === The "categories" parameter === For backwards compatibility this module also understands the '''categories''' parameter. It works the same as '''nocat'''. Like this: * If "<code>categories = false</code>" then this template does ''not'' categorize. * If '''categories''' is empty or undefined then this template categorizes as usual. * If "<code>categories = true</code>" this template categorizes even when on blacklisted pages. * The categories parameter also accepts aliases for <code>true</code> and <code>false</code> as defined by [[Module:Yesno]], e.g. "yes", "y", "true", and 1 for <code>true</code>, and "no", "n", "false", and 0 for <code>false</code>. === The "category2" parameter === For backwards compatibility this template kind of supports the old "category =" parameter. But the parameter name "category" is already used in this module to feed category data for when in category space. So instead this template uses '''category2''' for the usage similar to '''nocat'''. Like this: * If "<code>category2 = "</code>" (empty but defined), or "<code>category2 = 'no'</code>", or if '''category2''' is fed any other data (except as described in the next two points), then this template does ''not'' categorize. * If '''category2''' is undefined or if "<code>category2 = '¬'</code>", then this template categorizes as usual. * If "<code>category2 = 'yes'</code>" this template categorizes even when on blacklisted pages. === Categories and text === Besides from categories, you can feed anything else to this module, for instance some text. Like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local result = 'This is a module used on talk pages.' local category = categoryHandler{ talk = '[[Category:Somecat]]', other = '<p class="error">This module should only be used on talk pages.</p>', nocat = frame.args.nocat -- So "nocat=true/false" works } category = category or '' -- Check that we don't have a nil value for the category variable. return result .. category end return p </syntaxhighlight> When the module code above is used on anything other than a talk page, it will look like this: :This is a module used on talk pages.{{#invoke:category handler|main | talk = [[Category:Somecat]] | other = <p class="error">This module should only be used on talk pages.</p> | nocat = {{{nocat|}}} <!--So "nocat=true/false" works--> }} That text will not show on blacklisted pages, so don't use this method to show any important information. Feeding "<code>nocat = 'true'</code>" to the template hides the text, just as it suppresses any categories. === The "page" parameter === For testing and demonstration purposes this module can take a parameter named '''page'''. Like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local category = categoryHandler{ main = 'Category:Some cat', talk = 'Category:Talk cat', nocat = frame.args.nocat, -- So "nocat=true/false" works page = 'User talk:Example' } return category end return p </syntaxhighlight> In the above code we on purpose left out the brackets around the category names so we see the output on the page. No matter on what kind of page the code above is used it will return this: :{{#invoke:category handler|main | main = Category:Some cat | talk = Category:Talk cat | nocat = {{{nocat|}}} <!--So "nocat=true/false" works--> | page = User talk:Example }} The '''page''' parameter makes this module behave exactly as if on that page. Even the blacklist works. The pagename doesn't have to be an existing page. If the '''page''' parameter is empty or undefined, the name of the current page determines the result. You can make it so your module also understands the '''page''' parameter. That means you can test how your template will categorize on different pages, without having to actually edit those pages. Then do like this: <syntaxhighlight lang="lua"> p = {} local categoryHandler = require( 'Module:Category handler' ).main function p.main( frame ) local category = categoryHandler{ main = 'Category:Some cat', talk = 'Category:Talk cat', nocat = frame.args.nocat, -- So "nocat=true/false" works page = frame.args.page -- For testing } return category end return p </syntaxhighlight> === Parameters === List of all parameters: * First positional parameter - for default settings * subpage = 'no' / 'only' * 1, 2, 3 ... * all = '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text' * main = 1, 2, 3 ... / '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text' * ... * other = 1, 2, 3 ... / '<nowiki>[[Category:Somecat]]</nowiki>' / 'Text' * nocat = frame.args.nocat / true / false / 'yes' / 'no' / 'y' / 'n' / 'true' / 'false' / 1 / 0 * categories = frame.args.categories / false / true / 'no' / 'yes' / 'n' / 'y' / 'false' / 'true' / 0 / 1 * category2 = frame.args.category or '¬' / 'no' / 'not defined' / '¬' / 'yes' * page = frame.args.page / 'User:Example' Note that empty values to the "main" ... "other" parameters have special meaning (see examples above). The "all" parameter doesn't understand numbered parameters, since there should never be a need for that. == Exporting to other wikis == This module can be exported to other wikis by changing the configuration values in the <code>cfg</code> table. All the variable values are configurable, so after the configuration values have been set there should be no need to alter the main module code. Details of each configuration value are included in the module code comments. In addition, this module requires [[Module:Namespace detect]] to be available on the local wiki. == See also == * {{tl|Category handler}} – for using this module with templates, rather than Lua modules. * [[Wikipedia:Category suppression]] – The how-to guide. * [[Wikipedia:WikiProject Category Suppression]] – The WikiProject. * [[Wikipedia:Namespace]] – Lists all the namespaces. 603e893f1993e7e6fa21bb562e50d87d4daccf94 Module:Namespace detect 828 26 42 2023-10-07T15:45:02Z Silentg 2 Created page with "--[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are..." Scribunto text/plain --[[ -------------------------------------------------------------------------------- -- -- -- NAMESPACE DETECT -- -- -- -- This module implements the {{namespace detect}} template in Lua, with a -- -- few improvements: all namespaces and all namespace aliases are supported, -- -- and namespace names are detected automatically for the local wiki. The -- -- module can also use the corresponding subject namespace value if it is -- -- used on a talk page. Parameter names can be configured for different wikis -- -- by altering the values in the "cfg" table in -- -- Module:Namespace detect/config. -- -- -- -------------------------------------------------------------------------------- --]] local data = mw.loadData('Module:Namespace detect/data') local argKeys = data.argKeys local cfg = data.cfg local mappings = data.mappings local yesno = require('Module:Yesno') local mArguments -- Lazily initialise Module:Arguments local mTableTools -- Lazily initilalise Module:TableTools local ustringLower = mw.ustring.lower local p = {} local function fetchValue(t1, t2) -- Fetches a value from the table t1 for the first key in array t2 where -- a non-nil value of t1 exists. for i, key in ipairs(t2) do local value = t1[key] if value ~= nil then return value end end return nil end local function equalsArrayValue(t, value) -- Returns true if value equals a value in the array t. Otherwise -- returns false. for i, arrayValue in ipairs(t) do if value == arrayValue then return true end end return false end function p.getPageObject(page) -- Get the page object, passing the function through pcall in case of -- errors, e.g. being over the expensive function count limit. if page then local success, pageObject = pcall(mw.title.new, page) if success then return pageObject else return nil end else return mw.title.getCurrentTitle() end end -- Provided for backward compatibility with other modules function p.getParamMappings() return mappings end local function getNamespace(args) -- This function gets the namespace name from the page object. local page = fetchValue(args, argKeys.demopage) if page == '' then page = nil end local demospace = fetchValue(args, argKeys.demospace) if demospace == '' then demospace = nil end local subjectns = fetchValue(args, argKeys.subjectns) local ret if demospace then -- Handle "demospace = main" properly. if equalsArrayValue(argKeys.main, ustringLower(demospace)) then ret = mw.site.namespaces[0].name else ret = demospace end else local pageObject = p.getPageObject(page) if pageObject then if pageObject.isTalkPage then -- Get the subject namespace if the option is set, -- otherwise use "talk". if yesno(subjectns) then ret = mw.site.namespaces[pageObject.namespace].subject.name else ret = 'talk' end else ret = pageObject.nsText end else return nil -- return nil if the page object doesn't exist. end end ret = ret:gsub('_', ' ') return ustringLower(ret) end function p._main(args) -- Check the parameters stored in the mappings table for any matches. local namespace = getNamespace(args) or 'other' -- "other" avoids nil table keys local params = mappings[namespace] or {} local ret = fetchValue(args, params) --[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]] if ret == nil then ret = fetchValue(args, argKeys.other) end return ret end function p.main(frame) mArguments = require('Module:Arguments') local args = mArguments.getArgs(frame, {removeBlanks = false}) local ret = p._main(args) return ret or '' end function p.table(frame) --[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]] -- Load modules and initialise variables. mTableTools = require('Module:TableTools') local namespaces = mw.site.namespaces local cfg = data.cfg local useTalk = type(frame) == 'table' and type(frame.args) == 'table' and yesno(frame.args.talk) -- Whether to use the talk parameter. -- Get the header names. local function checkValue(value, default) if type(value) == 'string' then return value else return default end end local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Namespace') local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Aliases') -- Put the namespaces in order. local mappingsOrdered = {} for nsname, params in pairs(mappings) do if useTalk or nsname ~= 'talk' then local nsid = namespaces[nsname].id -- Add 1, as the array must start with 1; nsid 0 would be lost otherwise. nsid = nsid + 1 mappingsOrdered[nsid] = params end end mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered) -- Build the table. local ret = '{| class="wikitable"' .. '\n|-' .. '\n! ' .. nsHeader .. '\n! ' .. aliasesHeader for i, params in ipairs(mappingsOrdered) do for j, param in ipairs(params) do if j == 1 then ret = ret .. '\n|-' .. '\n| <code>' .. param .. '</code>' .. '\n| ' elseif j == 2 then ret = ret .. '<code>' .. param .. '</code>' else ret = ret .. ', <code>' .. param .. '</code>' end end end ret = ret .. '\n|-' .. '\n|}' return ret end return p a4757000273064f151f0f22dc0e139092e5ff443 Module:Namespace detect/doc 828 27 43 2023-10-07T15:46:23Z Silentg 2 Created page with "{{Used in system}} {{Module rating|protected}} {{Lua|Module:Namespace detect/data|Module:Yesno|Module:Arguments|Module:TableTools}} This module allows you to output different text depending on the [[WP:NAMESPACE|namespace]] that a given page is in. It is a [[WP:Lua|Lua]] implementation of the {{tl|namespace detect}} template, with a few improvements: all namespaces and all namespace aliases are supported, and namespace names are detected automatically for the local wiki..." wikitext text/x-wiki {{Used in system}} {{Module rating|protected}} {{Lua|Module:Namespace detect/data|Module:Yesno|Module:Arguments|Module:TableTools}} This module allows you to output different text depending on the [[WP:NAMESPACE|namespace]] that a given page is in. It is a [[WP:Lua|Lua]] implementation of the {{tl|namespace detect}} template, with a few improvements: all namespaces and all namespace aliases are supported, and namespace names are detected automatically for the local wiki. == Usage == <pre> {{#invoke: Namespace detect | main | page = <!-- page to detect namespace for, if not the current page --> | main = <!-- text to return for the main namespace --> | talk = <!-- text to return for talk namespaces --> <!-- text to return for specific subject namespaces --> | portal = | category = | user = | wikipedia = | mediawiki = | book = | timedtext = | template = | special = | media = | file = | image = | help = | module = | other = <!-- text to return for unspecified namespaces --> | demospace = <!-- namespace to display text for --> | subjectns = <!-- set to "yes" to treat talk pages as the corresponding subject page --> }} </pre> == Parameters == * '''main''' - text to return if the page is in the main namespace. * '''talk''' - text to return if the page is in a talk namespace. This can be any talk namespace - it will match any of "Talk:", "Wikipedia talk:", "User talk:", etc. * Subject namespace parameters, e.g. '''wikipedia''', '''user''', '''file'''... - the text to return if the page is in the corresponding namespace. This module accepts all subject namespaces as parameters, including [[Wikipedia:Namespace#Aliases|namespace aliases]] and [[Wikipedia:Namespace#Virtual namespaces|virtual namespaces]]. See below for a list of supported values. * '''other''' - text to return if no parameters for the page's namespace were specified. This text is also returned if {{para|demospace}} is set to an invalid namespace value. * '''subjectns''' - if on a talk page, use the corresponding subject page. Can be set with values of "yes", "y", "true" or "1". * '''demopage''' - specifies a page to detect the namespace of. If not specified, and if the {{para|demospace}} parameter is not set, then the module uses the current page. * '''demospace''' - force the module to behave as if the page was in the specified namespace. Often used for demonstrations. === Namespace parameters === Possible values for subject namespace parameters are as follows: {{#invoke:Namespace detect|table}} == Table function == Use the following to display a table with the different possible namespace parameters: &#123;&#123;#invoke:Namespace detect|table|talk=''yes''&#125;&#125; To include the parameter for talk namespaces, use {{para|talk|yes}}. == Porting to different wikis == This module is designed to be portable. To use it on a different wiki, all you need to do is to change the values in [[Module:Namespace detect/config]]. Instructions are available on that page. == Technical details == The module uses a data page at [[Module:Namespace detect/data]]. This page is loaded with [[mw:Extension:Scribunto/Lua reference manual#mw.loadData|mw.loadData]], which means it is processed once per page rather than once per #invoke. This was done for performance reasons. 48d83d74692978120e623424c21160f00e65e75b Module:Namespace detect/data 828 28 44 2023-10-07T15:47:19Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function..." Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect data -- -- This module holds data for [[Module:Namespace detect]] to be loaded per -- -- page, rather than per #invoke, for performance reasons. -- -------------------------------------------------------------------------------- local cfg = require('Module:Namespace detect/config') local function addKey(t, key, defaultKey) if key ~= defaultKey then t[#t + 1] = key end end -- Get a table of parameters to query for each default parameter name. -- This allows wikis to customise parameter names in the cfg table while -- ensuring that default parameter names will always work. The cfg table -- values can be added as a string, or as an array of strings. local defaultKeys = { 'main', 'talk', 'other', 'subjectns', 'demospace', 'demopage' } local argKeys = {} for i, defaultKey in ipairs(defaultKeys) do argKeys[defaultKey] = {defaultKey} end for defaultKey, t in pairs(argKeys) do local cfgValue = cfg[defaultKey] local cfgValueType = type(cfgValue) if cfgValueType == 'string' then addKey(t, cfgValue, defaultKey) elseif cfgValueType == 'table' then for i, key in ipairs(cfgValue) do addKey(t, key, defaultKey) end end cfg[defaultKey] = nil -- Free the cfg value as we don't need it any more. end local function getParamMappings() --[[ -- Returns a table of how parameter names map to namespace names. The keys -- are the actual namespace names, in lower case, and the values are the -- possible parameter names for that namespace, also in lower case. The -- table entries are structured like this: -- { -- [''] = {'main'}, -- ['wikipedia'] = {'wikipedia', 'project', 'wp'}, -- ... -- } --]] local mappings = {} local mainNsName = mw.site.subjectNamespaces[0].name mainNsName = mw.ustring.lower(mainNsName) mappings[mainNsName] = mw.clone(argKeys.main) mappings['talk'] = mw.clone(argKeys.talk) for nsid, ns in pairs(mw.site.subjectNamespaces) do if nsid ~= 0 then -- Exclude main namespace. local nsname = mw.ustring.lower(ns.name) local canonicalName = mw.ustring.lower(ns.canonicalName) mappings[nsname] = {nsname} if canonicalName ~= nsname then table.insert(mappings[nsname], canonicalName) end for _, alias in ipairs(ns.aliases) do table.insert(mappings[nsname], mw.ustring.lower(alias)) end end end return mappings end return { argKeys = argKeys, cfg = cfg, mappings = getParamMappings() } d224f42a258bc308ef3ad8cc8686cd7a4f47d005 Module:Namespace detect/data/doc 828 29 45 2023-10-07T15:48:11Z Silentg 2 Created page with "{{Module rating|protected}} {{used in system}} {{Lua|Module:Namespace detect/config}} This is a data page for [[Module:Namespace detect]] and [[Module:Category handler/shared]]. It is loaded by the main module using mw.loadData, which means it is only processed once per page rather than once per #invoke." wikitext text/x-wiki {{Module rating|protected}} {{used in system}} {{Lua|Module:Namespace detect/config}} This is a data page for [[Module:Namespace detect]] and [[Module:Category handler/shared]]. It is loaded by the main module using mw.loadData, which means it is only processed once per page rather than once per #invoke. 9935d604067362cf867e213811884d1d5011e9b9 Module:Namespace detect/config 828 30 46 2023-10-07T15:49:27Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- --..." Scribunto text/plain -------------------------------------------------------------------------------- -- Namespace detect configuration data -- -- -- -- This module stores configuration data for Module:Namespace detect. Here -- -- you can localise the module to your wiki's language. -- -- -- -- To activate a configuration item, you need to uncomment it. This means -- -- that you need to remove the text "-- " at the start of the line. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. Values added -- -- here will work in addition to the default English parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- cfg.foo = 'parameter name' -- -- -- -- To add multiple names, you can use this format: -- -- -- -- cfg.foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'} -- -------------------------------------------------------------------------------- ---- This parameter displays content for the main namespace: -- cfg.main = 'main' ---- This parameter displays in talk namespaces: -- cfg.talk = 'talk' ---- This parameter displays content for "other" namespaces (namespaces for which ---- parameters have not been specified): -- cfg.other = 'other' ---- This parameter makes talk pages behave as though they are the corresponding ---- subject namespace. Note that this parameter is used with [[Module:Yesno]]. ---- Edit that module to change the default values of "yes", "no", etc. -- cfg.subjectns = 'subjectns' ---- This parameter sets a demonstration namespace: -- cfg.demospace = 'demospace' ---- This parameter sets a specific page to compare: cfg.demopage = 'page' -------------------------------------------------------------------------------- -- Table configuration -- -- These configuration items allow customisation of the "table" function, -- -- used to generate a table of possible parameters in the module -- -- documentation. -- -------------------------------------------------------------------------------- ---- The header for the namespace column in the wikitable containing the list of ---- possible subject-space parameters. -- cfg.wikitableNamespaceHeader = 'Namespace' ---- The header for the wikitable containing the list of possible subject-space ---- parameters. -- cfg.wikitableAliasesHeader = 'Aliases' -------------------------------------------------------------------------------- -- End of configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 0e4ff08d13c4b664d66b32c232deb129b77c1a56 Module:Namespace detect/config/doc 828 31 47 2023-10-07T15:49:42Z Silentg 2 Created page with "{{module rating|protected}} {{used in system}} This module provides configuration data for [[Module:Namespace detect]]. To change the data, please follow the instructions in the module comments." wikitext text/x-wiki {{module rating|protected}} {{used in system}} This module provides configuration data for [[Module:Namespace detect]]. To change the data, please follow the instructions in the module comments. 1d1398c82a511e65717d9725230f68a461bee81e Module:TableTools 828 32 48 2023-10-07T15:50:51Z Silentg 2 Created page with "------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke...." Scribunto text/plain ------------------------------------------------------------------------------------ -- TableTools -- -- -- -- This module includes a number of functions for dealing with Lua tables. -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke. -- ------------------------------------------------------------------------------------ local libraryUtil = require('libraryUtil') local p = {} -- Define often-used variables and functions. local floor = math.floor local infinity = math.huge local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti ------------------------------------------------------------------------------------ -- isPositiveInteger -- -- This function returns true if the given value is a positive integer, and false -- if not. Although it doesn't operate on tables, it is included here as it is -- useful for determining whether a given table key is in the array part or the -- hash part of a table. ------------------------------------------------------------------------------------ function p.isPositiveInteger(v) return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity end ------------------------------------------------------------------------------------ -- isNan -- -- This function returns true if the given number is a NaN value, and false if -- not. Although it doesn't operate on tables, it is included here as it is useful -- for determining whether a value can be a valid table key. Lua will generate an -- error if a NaN is used as a table key. ------------------------------------------------------------------------------------ function p.isNan(v) return type(v) == 'number' and v ~= v end ------------------------------------------------------------------------------------ -- shallowClone -- -- This returns a clone of a table. The value returned is a new table, but all -- subtables and functions are shared. Metamethods are respected, but the returned -- table will have no metatable of its own. ------------------------------------------------------------------------------------ function p.shallowClone(t) checkType('shallowClone', 1, t, 'table') local ret = {} for k, v in pairs(t) do ret[k] = v end return ret end ------------------------------------------------------------------------------------ -- removeDuplicates -- -- This removes duplicate values from an array. Non-positive-integer keys are -- ignored. The earliest value is kept, and all subsequent duplicate values are -- removed, but otherwise the array order is unchanged. ------------------------------------------------------------------------------------ function p.removeDuplicates(arr) checkType('removeDuplicates', 1, arr, 'table') local isNan = p.isNan local ret, exists = {}, {} for _, v in ipairs(arr) do if isNan(v) then -- NaNs can't be table keys, and they are also unique, so we don't need to check existence. ret[#ret + 1] = v else if not exists[v] then ret[#ret + 1] = v exists[v] = true end end end return ret end ------------------------------------------------------------------------------------ -- numKeys -- -- This takes a table and returns an array containing the numbers of any numerical -- keys that have non-nil values, sorted in numerical order. ------------------------------------------------------------------------------------ function p.numKeys(t) checkType('numKeys', 1, t, 'table') local isPositiveInteger = p.isPositiveInteger local nums = {} for k in pairs(t) do if isPositiveInteger(k) then nums[#nums + 1] = k end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- affixNums -- -- This takes a table and returns an array containing the numbers of keys with the -- specified prefix and suffix. For example, for the table -- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return -- {1, 3, 6}. ------------------------------------------------------------------------------------ function p.affixNums(t, prefix, suffix) checkType('affixNums', 1, t, 'table') checkType('affixNums', 2, prefix, 'string', true) checkType('affixNums', 3, suffix, 'string', true) local function cleanPattern(s) -- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally. return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1') end prefix = prefix or '' suffix = suffix or '' prefix = cleanPattern(prefix) suffix = cleanPattern(suffix) local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$' local nums = {} for k in pairs(t) do if type(k) == 'string' then local num = mw.ustring.match(k, pattern) if num then nums[#nums + 1] = tonumber(num) end end end table.sort(nums) return nums end ------------------------------------------------------------------------------------ -- numData -- -- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table -- of subtables in the format -- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}. -- Keys that don't end with an integer are stored in a subtable named "other". The -- compress option compresses the table so that it can be iterated over with -- ipairs. ------------------------------------------------------------------------------------ function p.numData(t, compress) checkType('numData', 1, t, 'table') checkType('numData', 2, compress, 'boolean', true) local ret = {} for k, v in pairs(t) do local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$') if num then num = tonumber(num) local subtable = ret[num] or {} if prefix == '' then -- Positional parameters match the blank string; put them at the start of the subtable instead. prefix = 1 end subtable[prefix] = v ret[num] = subtable else local subtable = ret.other or {} subtable[k] = v ret.other = subtable end end if compress then local other = ret.other ret = p.compressSparseArray(ret) ret.other = other end return ret end ------------------------------------------------------------------------------------ -- compressSparseArray -- -- This takes an array with one or more nil values, and removes the nil values -- while preserving the order, so that the array can be safely traversed with -- ipairs. ------------------------------------------------------------------------------------ function p.compressSparseArray(t) checkType('compressSparseArray', 1, t, 'table') local ret = {} local nums = p.numKeys(t) for _, num in ipairs(nums) do ret[#ret + 1] = t[num] end return ret end ------------------------------------------------------------------------------------ -- sparseIpairs -- -- This is an iterator for sparse arrays. It can be used like ipairs, but can -- handle nil values. ------------------------------------------------------------------------------------ function p.sparseIpairs(t) checkType('sparseIpairs', 1, t, 'table') local nums = p.numKeys(t) local i = 0 local lim = #nums return function () i = i + 1 if i <= lim then local key = nums[i] return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- size -- -- This returns the size of a key/value pair table. It will also work on arrays, -- but for arrays it is more efficient to use the # operator. ------------------------------------------------------------------------------------ function p.size(t) checkType('size', 1, t, 'table') local i = 0 for _ in pairs(t) do i = i + 1 end return i end local function defaultKeySort(item1, item2) -- "number" < "string", so numbers will be sorted before strings. local type1, type2 = type(item1), type(item2) if type1 ~= type2 then return type1 < type2 elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then return tostring(item1) < tostring(item2) else return item1 < item2 end end ------------------------------------------------------------------------------------ -- keysToList -- -- Returns an array of the keys in a table, sorted using either a default -- comparison function or a custom keySort function. ------------------------------------------------------------------------------------ function p.keysToList(t, keySort, checked) if not checked then checkType('keysToList', 1, t, 'table') checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'}) end local arr = {} local index = 1 for k in pairs(t) do arr[index] = k index = index + 1 end if keySort ~= false then keySort = type(keySort) == 'function' and keySort or defaultKeySort table.sort(arr, keySort) end return arr end ------------------------------------------------------------------------------------ -- sortedPairs -- -- Iterates through a table, with the keys sorted using the keysToList function. -- If there are only numerical keys, sparseIpairs is probably more efficient. ------------------------------------------------------------------------------------ function p.sortedPairs(t, keySort) checkType('sortedPairs', 1, t, 'table') checkType('sortedPairs', 2, keySort, 'function', true) local arr = p.keysToList(t, keySort, true) local i = 0 return function () i = i + 1 local key = arr[i] if key ~= nil then return key, t[key] else return nil, nil end end end ------------------------------------------------------------------------------------ -- isArray -- -- Returns true if the given value is a table and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArray(v) if type(v) ~= 'table' then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- isArrayLike -- -- Returns true if the given value is iterable and all keys are consecutive -- integers starting at 1. ------------------------------------------------------------------------------------ function p.isArrayLike(v) if not pcall(pairs, v) then return false end local i = 0 for _ in pairs(v) do i = i + 1 if v[i] == nil then return false end end return true end ------------------------------------------------------------------------------------ -- invert -- -- Transposes the keys and values in an array. For example, {"a", "b", "c"} -> -- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to -- the index of the last duplicate) and NaN values are ignored. ------------------------------------------------------------------------------------ function p.invert(arr) checkType("invert", 1, arr, "table") local isNan = p.isNan local map = {} for i, v in ipairs(arr) do if not isNan(v) then map[v] = i end end return map end ------------------------------------------------------------------------------------ -- listToSet -- -- Creates a set from the array part of the table. Indexing the set by any of the -- values of the array returns true. For example, {"a", "b", "c"} -> -- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them -- never equal to any value (including other NaNs or even themselves). ------------------------------------------------------------------------------------ function p.listToSet(arr) checkType("listToSet", 1, arr, "table") local isNan = p.isNan local set = {} for _, v in ipairs(arr) do if not isNan(v) then set[v] = true end end return set end ------------------------------------------------------------------------------------ -- deepCopy -- -- Recursive deep copy function. Preserves identities of subtables. ------------------------------------------------------------------------------------ local function _deepCopy(orig, includeMetatable, already_seen) -- Stores copies of tables indexed by the original table. already_seen = already_seen or {} local copy = already_seen[orig] if copy ~= nil then return copy end if type(orig) == 'table' then copy = {} for orig_key, orig_value in pairs(orig) do copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen) end already_seen[orig] = copy if includeMetatable then local mt = getmetatable(orig) if mt ~= nil then local mt_copy = _deepCopy(mt, includeMetatable, already_seen) setmetatable(copy, mt_copy) already_seen[mt] = mt_copy end end else -- number, string, boolean, etc copy = orig end return copy end function p.deepCopy(orig, noMetatable, already_seen) checkType("deepCopy", 3, already_seen, "table", true) return _deepCopy(orig, not noMetatable, already_seen) end ------------------------------------------------------------------------------------ -- sparseConcat -- -- Concatenates all values in the table that are indexed by a number, in order. -- sparseConcat{a, nil, c, d} => "acd" -- sparseConcat{nil, b, c, d} => "bcd" ------------------------------------------------------------------------------------ function p.sparseConcat(t, sep, i, j) local arr = {} local arr_i = 0 for _, v in p.sparseIpairs(t) do arr_i = arr_i + 1 arr[arr_i] = v end return table.concat(arr, sep, i, j) end ------------------------------------------------------------------------------------ -- length -- -- Finds the length of an array, or of a quasi-array with keys such as "data1", -- "data2", etc., using an exponential search algorithm. It is similar to the -- operator #, but may return a different value when there are gaps in the array -- portion of the table. Intended to be used on data loaded with mw.loadData. For -- other tables, use #. -- Note: #frame.args in frame object always be set to 0, regardless of the number -- of unnamed template parameters, so use this function for frame.args. ------------------------------------------------------------------------------------ function p.length(t, prefix) -- requiring module inline so that [[Module:Exponential search]] which is -- only needed by this one function doesn't get millions of transclusions local expSearch = require("Module:Exponential search") checkType('length', 1, t, 'table') checkType('length', 2, prefix, 'string', true) return expSearch(function (i) local key if prefix then key = prefix .. tostring(i) else key = i end return t[key] ~= nil end) or 0 end ------------------------------------------------------------------------------------ -- inArray -- -- Returns true if valueToFind is a member of the array, and false otherwise. ------------------------------------------------------------------------------------ function p.inArray(arr, valueToFind) checkType("inArray", 1, arr, "table") -- if valueToFind is nil, error? for _, v in ipairs(arr) do if v == valueToFind then return true end end return false end return p 085e7094ac84eb0132ee65822cf3f69cd8ba3d81 Module:TableTools/doc 828 33 49 2023-10-07T15:51:16Z Silentg 2 Created page with "{{used in system}} {{module rating|protected}} {{lua|Module:Exponential search|noprotcat=yes}} This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke. == Loading the module == To use any of the functions, first you must load the module. <syntaxhighlight lang="lua"> local TableTools = require('Module:TableTools') </syntaxhighlight> == isPosit..." wikitext text/x-wiki {{used in system}} {{module rating|protected}} {{lua|Module:Exponential search|noprotcat=yes}} This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke. == Loading the module == To use any of the functions, first you must load the module. <syntaxhighlight lang="lua"> local TableTools = require('Module:TableTools') </syntaxhighlight> == isPositiveInteger == <syntaxhighlight lang="lua"> TableTools.isPositiveInteger(value) </syntaxhighlight> Returns <code>true</code> if <code>''value''</code> is a positive integer, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table. == isNan == <syntaxhighlight lang="lua"> TableTools.isNan(value) </syntaxhighlight> Returns <code>true</code> if <code>''value''</code> is a [[NaN]] value, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.) == shallowClone == <syntaxhighlight lang="lua"> TableTools.shallowClone(t) </syntaxhighlight> Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use <code>[[mw:Extension:Scribunto/Lua reference manual#mw.clone|mw.clone]]</code> instead. If you want to make a new table with no shared subtables and without metatables transferred, use <code>[[#deepCopy|deepCopy]]</code> with the <code>noMetatable</code> option. == removeDuplicates == <syntaxhighlight lang="lua"> TableTools.removeDuplicates(t) </syntaxhighlight> Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first <code>nil</code> value. (For arrays containing <code>nil</code> values, you can use <code>[[#compressSparseArray|compressSparseArray]]</code> first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {{code|code={5, 4, 4, 3, 4, 2, 2, 1}|lang=lua}} <code>removeDuplicates</code> will return {{code|code={5, 4, 3, 2, 1}|lang=lua}}. == numKeys == <syntaxhighlight lang="lua"> TableTools.numKeys(t) </syntaxhighlight> Takes a table <code>''t''</code> and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {{code|code={'foo', nil, 'bar', 'baz', a = 'b'}|lang=lua}}, <code>numKeys</code> will return {{code|code={1, 3, 4}|lang=lua}}. == affixNums == <syntaxhighlight lang="lua"> TableTools.affixNums(t, prefix, suffix) </syntaxhighlight> Takes a table <code>''t''</code> and returns an array containing the numbers of keys with the optional prefix <code>''prefix''</code> and the optional suffix <code>''suffix''</code>. For example, for the table {{code|code={a1 = 'foo', a3 = 'bar', a6 = 'baz'}|lang=lua}} and the prefix <code>'a'</code>, <code>affixNums</code> will return {{code|code={1, 3, 6}|lang=lua}}. All characters in <code>''prefix''</code> and <code>''suffix''</code> are interpreted literally. == numData == <syntaxhighlight lang="lua"> TableTools.numData(t, compress) </syntaxhighlight> Given a table with keys like <code>"foo1"</code>, <code>"bar1"</code>, <code>"foo2"</code>, and <code>"baz2"</code>, returns a table of subtables in the format {{code|code={ [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }|lang=lua}}. Keys that don't end with an integer are stored in a subtable named <code>"other"</code>. The compress option compresses the table so that it can be iterated over with <code>ipairs</code>. == compressSparseArray == <syntaxhighlight lang="lua"> TableTools.compressSparseArray(t) </syntaxhighlight> Takes an array <code>''t''</code> with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with <code>ipairs</code>. Any keys that are not positive integers are removed. For example, for the table {{code|code={1, nil, foo = 'bar', 3, 2}|lang=lua}}, <code>compressSparseArray</code> will return {{code|code={1, 3, 2}|lang=lua}}. == sparseIpairs == <syntaxhighlight lang="lua"> TableTools.sparseIpairs(t) </syntaxhighlight> This is an iterator function for traversing a sparse array <code>''t''</code>. It is similar to <code>[[mw:Extension:Scribunto/Lua reference manual#ipairs|ipairs]]</code>, but will continue to iterate until the highest numerical key, whereas <code>ipairs</code> may stop after the first <code>nil</code> value. Any keys that are not positive integers are ignored. Usually <code>sparseIpairs</code> is used in a generic <code>for</code> loop. <syntaxhighlight lang="lua"> for i, v in TableTools.sparseIpairs(t) do -- code block end </syntaxhighlight> Note that <code>sparseIpairs</code> uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function in its implementation. Although some table keys appear to be ignored, all table keys are accessed when it is run. == size == <syntaxhighlight lang="lua"> TableTools.size(t) </syntaxhighlight> Finds the size of a key/value pair table. For example, for the table {{code|code={foo = 'foo', bar = 'bar'}|lang=lua}}, <code>size</code> will return <code>2</code>. The function will also work on arrays, but for arrays it is more efficient to use the <code>#</code> operator. Note that to find the table size, this function uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function to iterate through all of the table keys. == keysToList == <syntaxhighlight lang="lua"> TableTools.keysToList(t, keySort, checked) </syntaxhighlight> Returns a list of the keys in a table, sorted using either a default comparison function or a custom <code>''keySort''</code> function, which follows the same rules as the <code>comp</code> function supplied to <code>[[mw:Extension:Scribunto/Lua reference manual#table.sort|table.sort]]</code>. If <code>''keySort''</code> is <code>false</code>, no sorting is done. Set <code>''checked''</code> to <code>true</code> to skip the internal type checking. == sortedPairs == <syntaxhighlight lang="lua"> TableTools.sortedPairs(t, keySort) </syntaxhighlight> Iterates through a table, with the keys sorted using the <code>keysToList</code> function. If there are only numerical keys, <code>sparseIpairs</code> is probably more efficient. == isArray == <syntaxhighlight lang="lua"> TableTools.isArray(value) </syntaxhighlight> Returns <code>true</code> if <code>''value''</code> is a table and all keys are consecutive integers starting at 1. == isArrayLike == <syntaxhighlight lang="lua"> TableTools.isArrayLike(value) </syntaxhighlight> Returns <code>true</code> if <code>''value''</code> is iterable and all keys are consecutive integers starting at 1. == invert == <syntaxhighlight lang="lua"> TableTools.invert(arr) </syntaxhighlight> Transposes the keys and values in an array. For example, {{code|invert{ "a", "b", "c" }|lua}} yields {{code|code={ a=1, b=2, c=3 }|lang=lua}}. == listToSet == <syntaxhighlight lang="lua"> TableTools.listToSet(arr) </syntaxhighlight> Creates a set from the array part of the table <code>''arr''</code>. Indexing the set by any of the values of the array returns <code>true</code>. For example, {{code|listToSet{ "a", "b", "c" }|lua}} yields {{code|code={ a=true, b=true, c=true }|lang=lua}}. See also [[Module:Lua set]] for more advanced ways to create a set. == deepCopy == <syntaxhighlight lang="lua"> TableTools.deepCopy(orig, noMetatable, alreadySeen) </syntaxhighlight> Creates a copy of the table <code>''orig''</code>. As with <code>mw.clone</code>, all values that are not functions are duplicated and the identity of tables is preserved. If <code>''noMetatable''</code> is <code>true</code>, then the metatable (if any) is not copied. Can copy tables loaded with <code>mw.loadData</code>. Similar to <code>mw.clone</code>, but <code>mw.clone</code> cannot copy tables loaded with <code>mw.loadData</code> and does not allow metatables <em>not</em> to be copied. == sparseConcat == <syntaxhighlight lang="lua"> TableTools.sparseConcat(t, sep, i, j) </syntaxhighlight> Concatenates all values in the table that are indexed by a positive integer, in order. For example, {{code|sparseConcat{ "a", nil, "c", "d" }|lua}} yields {{code|"acd"|lua}} and {{code|sparseConcat{ nil, "b", "c", "d" }|lua}} yields {{code|"bcd"|lua}}. == length == <syntaxhighlight lang="lua"> TableTools.length(t, prefix) </syntaxhighlight> Finds the length of an array or of a quasi-array with keys with an optional <code>''prefix''</code> such as "data1", "data2", etc. It uses an [[exponential search]] algorithm to find the length, so as to use as few table lookups as possible. This algorithm is useful for arrays that use metatables (e.g. [[mw:Extension:Scribunto/Lua reference manual#frame.args|frame.args]]) and for quasi-arrays. For normal arrays, just use the [[mw:Extension:Scribunto/Lua reference manual#Length operator|# operator]], as it is implemented in [[C (programming language)|C]] and will be quicker. == inArray == <syntaxhighlight lang="lua"> TableTools.inArray(arr, valueToFind) </syntaxhighlight> Returns <code>true</code> if <code>''valueToFind''</code> is a member of the array <code>''arr''</code>, and <code>false</code> otherwise. <includeonly>{{Sandbox other|| [[Category:Lua metamodules|TableTools]] }}</includeonly> 6fcbbdc2d7277a80556bd4c7daaf380903d3d831 Module:Exponential search 828 34 50 2023-10-07T15:52:25Z Silentg 2 Created page with "-- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, low..." Scribunto text/plain -- This module provides a generic exponential search algorithm. require[[strict]] local checkType = require('libraryUtil').checkType local floor = math.floor local function midPoint(lower, upper) return floor(lower + (upper - lower) / 2) end local function search(testFunc, i, lower, upper) if testFunc(i) then if i + 1 == upper then return i end lower = i if upper then i = midPoint(lower, upper) else i = i * 2 end return search(testFunc, i, lower, upper) else upper = i i = midPoint(lower, upper) return search(testFunc, i, lower, upper) end end return function (testFunc, init) checkType('Exponential search', 1, testFunc, 'function') checkType('Exponential search', 2, init, 'number', true) if init and (init < 1 or init ~= floor(init) or init == math.huge) then error(string.format( "invalid init value '%s' detected in argument #2 to " .. "'Exponential search' (init value must be a positive integer)", tostring(init) ), 2) end init = init or 2 if not testFunc(1) then return nil end return search(testFunc, init, 1, nil) end a9037be0c44536be79b2d7a26155bfb907368ae7 Module:Exponential search/doc 828 35 51 2023-10-07T15:52:56Z Silentg 2 Created page with "This module provides a generic [[exponential search]] algorithm. This kind of search can be useful when you want to find a key in some kind of sorted array, and you want to do it by checking as few array elements as possible. This could include situations like: * Finding the highest archive number in a set of archives without checking whether they all exist. * Finding the number of positional arguments in frame.args without having to expand the wikitext for each of them...." wikitext text/x-wiki This module provides a generic [[exponential search]] algorithm. This kind of search can be useful when you want to find a key in some kind of sorted array, and you want to do it by checking as few array elements as possible. This could include situations like: * Finding the highest archive number in a set of archives without checking whether they all exist. * Finding the number of positional arguments in frame.args without having to expand the wikitext for each of them. You shouldn't use this module if any of the following apply: # You can use the [[mw:Extension:Scribunto/Lua reference manual#Length operator|Lua length operator]] to find what you need. # Your array has any gaps in it. (In other words, any of the items before the final item is <code>nil</code>, e.g. <syntaxhighlight lang="lua" inline>{'foo', 'bar', nil, 'baz'}</syntaxhighlight>.) If you try and use this module on a sparse array, you might get an erroneous value. # Your array has less then about 10 items in it. It's possible to use this module for those arrays, but you will access most of the array elements anyway (perhaps some of them twice), and your code will be more complicated than if you just used a for loop. == Usage == First, load the module. <syntaxhighlight lang="lua"> local expSearch = require('Module:Exponential search') </syntaxhighlight> You can then use the expSearch function with the following syntax: <syntaxhighlight lang="lua"> expSearch(testFunc, init) </syntaxhighlight> Parameters: * <var>testFunc</var> - a test function for your array. This function should take a positive integer <var>i</var> as its first parameter. If the element corresponding to <var>i</var> is not in the array, then the function should return false or nil; and if it ''is'' in the array, then the function should return a truthy value (anything other than false or nil). (required) * <var>init</var> - the initial value of <var>i</var> to check. For advanced users. (optional) expSearch will return the highest value of <var>i</var> for which testFunc was truthy. If no values were truthy, the function will return nil. == Examples == === Jimbo's talk archives === [[User talk:Jimbo Wales]] has archives at [[User talk:Jimbo Wales/Archive 1]], [[User talk:Jimbo Wales/Archive 2]], ... To find the highest archive number, you would use code like this: <syntaxhighlight lang="lua"> local expSearch = require('Module:Exponential search') local highestArchive = expSearch(function (i) local archive = 'User talk:Jimbo Wales/Archive ' .. i return mw.title.new(archive).exists end) </syntaxhighlight> === Village pump archives === [[Wikipedia:Village pump (proposals)]] has old archives at [[Wikipedia:Village pump (proposals)/Archive A]], [[Wikipedia:Village pump (proposals)/Archive B]], etc. After they go through to Archive Z, the next archive is Archive AA. Although these archives aren't being updated anymore, as a demonstration we can find the highest one using this module; all we need is a function that converts from an integer to the corresponding archive name. <syntaxhighlight lang="lua"> local expSearch = require('Module:Exponential search') local function integerToAlpha(i) -- This function converts 1 to A, 2 to B, ... 26 to Z, 27 to AA, ... local ret = '' while i > 0 do local rem = i % 26 if rem == 0 then rem = 26 end local char = string.char(rem + 64) -- the "rem"th letter of the alphabet ret = char .. ret i = (i - rem) / 26 end return ret end local function integerToArchive(i) return 'Wikipedia:Village pump (proposals)/Archive ' .. integerToAlpha(i) end local highestInteger = expSearch(function (i) local archive = integerToArchive(i) return mw.title.new(archive).exists end) local highestArchive = integerToArchive(highestInteger) </syntaxhighlight> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 38059e276cf6ef2f0c404c0e8f51aac232d6d57d Module:Category handler/data 828 36 52 2023-10-07T15:54:01Z Silentg 2 Created page with "-- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(..." Scribunto text/plain -- This module assembles data to be passed to [[Module:Category handler]] using -- mw.loadData. This includes the configuration data and whether the current -- page matches the title blacklist. local data = require('Module:Category handler/config') local mShared = require('Module:Category handler/shared') local blacklist = require('Module:Category handler/blacklist') local title = mw.title.getCurrentTitle() data.currentTitleMatchesBlacklist = mShared.matchesBlacklist( title.prefixedText, blacklist ) data.currentTitleNamespaceParameters = mShared.getNamespaceParameters( title, mShared.getParamMappings() ) return data abbc68048ff698e88dda06b64ecf384bbf583120 Module:Category handler/data/doc 828 37 53 2023-10-07T15:54:45Z Silentg 2 Created page with "This module is used in conjunction with the category handler module to manage categories; it is a very important template used on millions of pages. {{Module rating|protected}} {{used in system}} {{Lua|Module:Category handler/config|Module:Category handler/shared|Module:Category handler/blacklist}}" wikitext text/x-wiki This module is used in conjunction with the category handler module to manage categories; it is a very important template used on millions of pages. {{Module rating|protected}} {{used in system}} {{Lua|Module:Category handler/config|Module:Category handler/shared|Module:Category handler/blacklist}} 0ac6af0f4ee02181e6f587282cfcfdb878ea5ea9 Module:Category handler/config 828 38 54 2023-10-07T15:55:39Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. ----------------------------..." Scribunto text/plain -------------------------------------------------------------------------------- -- [[Module:Category handler]] configuration data -- -- Language-specific parameter names and values can be set here. -- -- For blacklist config, see [[Module:Category handler/blacklist]]. -- -------------------------------------------------------------------------------- local cfg = {} -- Don't edit this line. -------------------------------------------------------------------------------- -- Start configuration data -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Parameter names -- -- These configuration items specify custom parameter names. -- -- To add one extra name, you can use this format: -- -- -- -- foo = 'parameter name', -- -- -- -- To add multiple names, you can use this format: -- -- -- -- foo = {'parameter name 1', 'parameter name 2', 'parameter name 3'}, -- -------------------------------------------------------------------------------- cfg.parameters = { -- The nocat and categories parameter suppress -- categorisation. They are used with Module:Yesno, and work as follows: -- -- cfg.nocat: -- Result of yesno() Effect -- true Categorisation is suppressed -- false Categorisation is allowed, and -- the blacklist check is skipped -- nil Categorisation is allowed -- -- cfg.categories: -- Result of yesno() Effect -- true Categorisation is allowed, and -- the blacklist check is skipped -- false Categorisation is suppressed -- nil Categorisation is allowed nocat = 'nocat', categories = 'categories', -- The parameter name for the legacy "category2" parameter. This skips the -- blacklist if set to the cfg.category2Yes value, and suppresses -- categorisation if present but equal to anything other than -- cfg.category2Yes or cfg.category2Negative. category2 = 'category2', -- cfg.subpage is the parameter name to specify how to behave on subpages. subpage = 'subpage', -- The parameter for data to return in all namespaces. all = 'all', -- The parameter name for data to return if no data is specified for the -- namespace that is detected. other = 'other', -- The parameter name used to specify a page other than the current page; -- used for testing and demonstration. demopage = 'page', } -------------------------------------------------------------------------------- -- Parameter values -- -- These are set values that can be used with certain parameters. Only one -- -- value can be specified, like this: -- -- -- -- cfg.foo = 'value name' -- -- -------------------------------------------------------------------------------- -- The following settings are used with the cfg.category2 parameter. Setting -- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2 -- is present but equal to anything other than cfg.category2Yes or -- cfg.category2Negative then it supresses cateogrisation. cfg.category2Yes = 'yes' cfg.category2Negative = '¬' -- The following settings are used with the cfg.subpage parameter. -- cfg.subpageNo is the value to specify to not categorise on subpages; -- cfg.subpageOnly is the value to specify to only categorise on subpages. cfg.subpageNo = 'no' cfg.subpageOnly = 'only' -------------------------------------------------------------------------------- -- Default namespaces -- -- This is a table of namespaces to categorise by default. The keys are the -- -- namespace numbers. -- -------------------------------------------------------------------------------- cfg.defaultNamespaces = { [ 0] = true, -- main [ 6] = true, -- file [ 12] = true, -- help [ 14] = true, -- category [100] = true, -- portal [108] = true, -- book } -------------------------------------------------------------------------------- -- Wrappers -- -- This is a wrapper template or a list of wrapper templates to be passed to -- -- [[Module:Arguments]]. -- -------------------------------------------------------------------------------- cfg.wrappers = 'Template:Category handler' -------------------------------------------------------------------------------- -- End configuration data -- -------------------------------------------------------------------------------- return cfg -- Don't edit this line. 373cd107b13a5b00e6a1b7e66a749f12502c849d Module:Category handler/config/doc 828 39 55 2023-10-07T15:56:35Z Silentg 2 Created page with "{{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}} <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>" wikitext text/x-wiki {{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}} <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 2b32cbbd34cf50b501809c68db187cdf6f9d334c Module:Category handler/shared 828 40 56 2023-10-07T15:57:12Z Silentg 2 Created page with "-- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return..." Scribunto text/plain -- This module contains shared functions used by [[Module:Category handler]] -- and its submodules. local p = {} function p.matchesBlacklist(page, blacklist) for i, pattern in ipairs(blacklist) do local match = mw.ustring.match(page, pattern) if match then return true end end return false end function p.getParamMappings(useLoadData) local dataPage = 'Module:Namespace detect/data' if useLoadData then return mw.loadData(dataPage).mappings else return require(dataPage).mappings end end function p.getNamespaceParameters(titleObj, mappings) -- We don't use title.nsText for the namespace name because it adds -- underscores. local mappingsKey if titleObj.isTalkPage then mappingsKey = 'talk' else mappingsKey = mw.site.namespaces[titleObj.namespace].name end mappingsKey = mw.ustring.lower(mappingsKey) return mappings[mappingsKey] or {} end return p d2d5de1a031e6ce97c242cbfa8afe7a92cb9eca5 Module:Category handler/shared/doc 828 41 57 2023-10-07T15:58:52Z Silentg 2 Created page with "{{Module rating |protected}} {{used in system}} {{Lua|Module:Namespace detect/data}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>" wikitext text/x-wiki {{Module rating |protected}} {{used in system}} {{Lua|Module:Namespace detect/data}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> ad9ad9af78f62b02930d66f650c1930443fb35e0 Module:Category handler/blacklist 828 42 58 2023-10-07T15:59:55Z Silentg 2 Created page with "-- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbo..." Scribunto text/plain -- This module contains the blacklist used by [[Module:Category handler]]. -- Pages that match Lua patterns in this list will not be categorised unless -- categorisation is explicitly requested. return { '^Main Page$', -- don't categorise the main page. -- Don't categorise the following pages or their subpages. -- "%f[/\0]" matches if the next character is "/" or the end of the string. '^Wikipedia:Cascade%-protected items%f[/\0]', '^User:UBX%f[/\0]', -- The userbox "template" space. '^User talk:UBX%f[/\0]', -- Don't categorise subpages of these pages, but allow -- categorisation of the base page. '^Wikipedia:Template index/.*$', -- Don't categorise archives. '/[aA]rchive', "^Wikipedia:Administrators' noticeboard/IncidentArchive%d+$", } 87469d7a9ef2a3c41b2bf04ae18f7c59a18fb855 Module:Category handler/blacklist/doc 828 43 59 2023-10-07T16:25:28Z Silentg 2 Created page with "{{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly>" wikitext text/x-wiki {{Module rating |protected}} {{used in system}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|''function_name''}}</code> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 6e4367788f67362df755e3c11ad8d64eb40778ff Module:Message box/ambox.css 828 44 60 2023-10-07T16:31:54Z Silentg 2 Created page with "/* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: rais..." sanitized-css text/css /* {{pp|small=y}} */ .ambox { border: 1px solid #a2a9b1; /* @noflip */ border-left: 10px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* Single border between stacked boxes. Take into account base templatestyles, * user styles, and Template:Dated maintenance category. * remove link selector when T200206 is fixed */ .ambox + link + .ambox, .ambox + link + style + .ambox, .ambox + link + link + .ambox, /* TODO: raise these as "is this really that necessary???". the change was Dec 2021 */ .ambox + .mw-empty-elt + link + .ambox, .ambox + .mw-empty-elt + link + style + .ambox, .ambox + .mw-empty-elt + link + link + .ambox { margin-top: -1px; } /* For the "small=left" option. */ /* must override .ambox + .ambox styles above */ html body.mediawiki .ambox.mbox-small-left { /* @noflip */ margin: 4px 1em 4px 0; overflow: hidden; width: 238px; border-collapse: collapse; font-size: 88%; line-height: 1.25em; } .ambox-speedy { /* @noflip */ border-left: 10px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ambox-delete { /* @noflip */ border-left: 10px solid #b32424; /* Red */ } .ambox-content { /* @noflip */ border-left: 10px solid #f28500; /* Orange */ } .ambox-style { /* @noflip */ border-left: 10px solid #fc3; /* Yellow */ } .ambox-move { /* @noflip */ border-left: 10px solid #9932cc; /* Purple */ } .ambox-protection { /* @noflip */ border-left: 10px solid #a2a9b1; /* Gray-gold */ } .ambox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.5em; width: 100%; } .ambox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.5em; text-align: center; } .ambox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.5em 2px 0; text-align: center; } /* An empty narrow cell */ .ambox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ambox .mbox-image-div { width: 52px; } /* Hack around MobileFrontend being opinionated */ html.client-js body.skin-minerva .mbox-text-span { margin-left: 23px !important; } @media (min-width: 720px) { .ambox { margin: 0 10%; /* 10% = Will not overlap with other elements */ } } 29898fdc5160b39a8f580c76efe77afa1f6f58a4 Module:Message box/cmbox.css 828 45 61 2023-10-07T16:33:36Z Silentg 2 Created page with "/* {{pp|small=y}} */ .cmbox { margin: 3px 0; border-collapse: collapse; border: 1px solid #a2a9b1; background-color: #dfe8ff; /* Default "notice" blue */ box-sizing: border-box; } .cmbox-speedy { border: 4px solid #b32424; /* Red */ background-color: #ffdbdb; /* Pink */ } .cmbox-delete { background-color: #ffdbdb; /* Pink */ } .cmbox-content { background-color: #ffe7ce; /* Orange */ } .cmbox-style { background-color: #fff9db; /* Yellow */..." sanitized-css text/css /* {{pp|small=y}} */ .cmbox { margin: 3px 0; border-collapse: collapse; border: 1px solid #a2a9b1; background-color: #dfe8ff; /* Default "notice" blue */ box-sizing: border-box; } .cmbox-speedy { border: 4px solid #b32424; /* Red */ background-color: #ffdbdb; /* Pink */ } .cmbox-delete { background-color: #ffdbdb; /* Pink */ } .cmbox-content { background-color: #ffe7ce; /* Orange */ } .cmbox-style { background-color: #fff9db; /* Yellow */ } .cmbox-move { background-color: #e4d8ff; /* Purple */ } .cmbox-protection { background-color: #efefe1; /* Gray-gold */ } .cmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .cmbox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .cmbox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .cmbox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .cmbox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .cmbox { margin: 3px 10%; } } 95109477b86803acfea977ae0bce2319e72f170d Module:Message box/fmbox.css 828 46 62 2023-10-07T16:34:48Z Silentg 2 Created page with "/* {{pp|small=y}} */ .fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #a2a9b1; background-color: #f8f9fa; /* Default "system" gray */ box-sizing: border-box; } .fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background-color: #ffdbdb; /* Pink */ } .fmbox-editnotice { background-color: transparent; } .fmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .fmbox .mbox-image { border: no..." sanitized-css text/css /* {{pp|small=y}} */ .fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #a2a9b1; background-color: #f8f9fa; /* Default "system" gray */ box-sizing: border-box; } .fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background-color: #ffdbdb; /* Pink */ } .fmbox-editnotice { background-color: transparent; } .fmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .fmbox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .fmbox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } .fmbox .mbox-invalid-type { text-align: center; } fca0f5e4b400e4a2ab158b219c52822451211d66 Module:Message box/imbox.css 828 47 63 2023-10-07T16:35:53Z Silentg 2 Created page with "/* {{pp|small=y}} */ .imbox { margin: 4px 0; border-collapse: collapse; border: 3px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* For imboxes inside imbox-text cells. */ .imbox .mbox-text .imbox { margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */ /* TODO: Still needed? */ display: block; /* Fix for webkit to force 100% width. */ } .imbox-speedy { border: 3px solid #b32424; /* Red */ background-color..." sanitized-css text/css /* {{pp|small=y}} */ .imbox { margin: 4px 0; border-collapse: collapse; border: 3px solid #36c; /* Default "notice" blue */ background-color: #fbfbfb; box-sizing: border-box; } /* For imboxes inside imbox-text cells. */ .imbox .mbox-text .imbox { margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */ /* TODO: Still needed? */ display: block; /* Fix for webkit to force 100% width. */ } .imbox-speedy { border: 3px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .imbox-delete { border: 3px solid #b32424; /* Red */ } .imbox-content { border: 3px solid #f28500; /* Orange */ } .imbox-style { border: 3px solid #fc3; /* Yellow */ } .imbox-move { border: 3px solid #9932cc; /* Purple */ } .imbox-protection { border: 3px solid #a2a9b1; /* Gray-gold */ } .imbox-license { border: 3px solid #88a; /* Dark gray */ background-color: #f7f8ff; /* Light gray */ } .imbox-featured { border: 3px solid #cba135; /* Brown-gold */ } .imbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .imbox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .imbox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .imbox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .imbox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .imbox { margin: 4px 10%; } } 1e82a3c342695a9b4fbdcc4e5e0930d4845a23d4 Module:Message box/ombox.css 828 48 64 2023-10-07T16:36:28Z Silentg 2 Created page with "/* {{pp|small=y}} */ .ombox { margin: 4px 0; border-collapse: collapse; border: 1px solid #a2a9b1; /* Default "notice" gray */ background-color: #f8f9fa; box-sizing: border-box; } /* For the "small=yes" option. */ .ombox.mbox-small { font-size: 88%; line-height: 1.25em; } .ombox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ombox-delete { border: 2px solid #b32424; /* Red */ } .ombox-content { border: 1p..." sanitized-css text/css /* {{pp|small=y}} */ .ombox { margin: 4px 0; border-collapse: collapse; border: 1px solid #a2a9b1; /* Default "notice" gray */ background-color: #f8f9fa; box-sizing: border-box; } /* For the "small=yes" option. */ .ombox.mbox-small { font-size: 88%; line-height: 1.25em; } .ombox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .ombox-delete { border: 2px solid #b32424; /* Red */ } .ombox-content { border: 1px solid #f28500; /* Orange */ } .ombox-style { border: 1px solid #fc3; /* Yellow */ } .ombox-move { border: 1px solid #9932cc; /* Purple */ } .ombox-protection { border: 2px solid #a2a9b1; /* Gray-gold */ } .ombox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .ombox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .ombox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .ombox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .ombox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .ombox { margin: 4px 10%; } .ombox.mbox-small { /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; width: 238px; } } 8fe3df4bb607e699eab2dbd23bd4a1a446391002 Module:Message box/tmbox.css 828 49 65 2023-10-07T16:37:10Z Silentg 2 Created page with "/* {{pp|small=y}} */ .tmbox { margin: 4px 0; border-collapse: collapse; border: 1px solid #c0c090; /* Default "notice" gray-brown */ background-color: #f8eaba; box-sizing: border-box; } /* For the "small=yes" option. */ .tmbox.mbox-small { font-size: 88%; line-height: 1.25em; } .tmbox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .tmbox-delete { border: 2px solid #b32424; /* Red */ } .tmbox-content { bord..." sanitized-css text/css /* {{pp|small=y}} */ .tmbox { margin: 4px 0; border-collapse: collapse; border: 1px solid #c0c090; /* Default "notice" gray-brown */ background-color: #f8eaba; box-sizing: border-box; } /* For the "small=yes" option. */ .tmbox.mbox-small { font-size: 88%; line-height: 1.25em; } .tmbox-speedy { border: 2px solid #b32424; /* Red */ background-color: #fee7e6; /* Pink */ } .tmbox-delete { border: 2px solid #b32424; /* Red */ } .tmbox-content { border: 2px solid #f28500; /* Orange */ } .tmbox-style { border: 2px solid #fc3; /* Yellow */ } .tmbox-move { border: 2px solid #9932cc; /* Purple */ } .tmbox .mbox-text { border: none; /* @noflip */ padding: 0.25em 0.9em; width: 100%; } .tmbox .mbox-image { border: none; /* @noflip */ padding: 2px 0 2px 0.9em; text-align: center; } .tmbox .mbox-imageright { border: none; /* @noflip */ padding: 2px 0.9em 2px 0; text-align: center; } /* An empty narrow cell */ .tmbox .mbox-empty-cell { border: none; padding: 0; width: 1px; } .tmbox .mbox-invalid-type { text-align: center; } @media (min-width: 720px) { .tmbox { margin: 4px 10%; } .tmbox.mbox-small { /* @noflip */ clear: right; /* @noflip */ float: right; /* @noflip */ margin: 4px 0 4px 1em; width: 238px; } } eaa4546995ebb3a8d20394cad8af74ea477bdb44 Module:Module wikitext 828 50 66 2023-10-07T16:39:27Z Silentg 2 Created page with "local p = {} p.text = '' function p.main() return p.text end function p._addText(text, preprocessFrame) if preprocessFrame ~= false then text = (preprocessFrame or mw.getCurrentFrame()):preprocess(text) end p.text = p.text .. text end return p" Scribunto text/plain local p = {} p.text = '' function p.main() return p.text end function p._addText(text, preprocessFrame) if preprocessFrame ~= false then text = (preprocessFrame or mw.getCurrentFrame()):preprocess(text) end p.text = p.text .. text end return p d3b1c2df9c8a2eb957a341073392e4c32d5e6186 Module:Module wikitext/doc 828 51 67 2023-10-07T16:41:43Z Silentg 2 Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Twinkle standard installation}} == Usage == This is an auxiliary module used to allow module pages to display wikitext. Use it by setting this module's <code>text</code> value to whatever content you want to display. The <code>_addText</code> helper method may be useful. For example, to tag a module with {{tl|db-g7}}, put <syntaxhighlight..." wikitext text/x-wiki <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Twinkle standard installation}} == Usage == This is an auxiliary module used to allow module pages to display wikitext. Use it by setting this module's <code>text</code> value to whatever content you want to display. The <code>_addText</code> helper method may be useful. For example, to tag a module with {{tl|db-g7}}, put <syntaxhighlight lang="lua" inline>require('Module:Module wikitext')._addText('{{db-g7}}')</syntaxhighlight> at the top of it. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 9721a815ef431a4233dcc3344dec4eb136b44c8b Module:Protection banner 828 52 68 2023-10-07T16:43:06Z Silentg 2 Created page with "-- This module implements {{pp-meta}} and its daughter templates such as -- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}. -- Initialise necessary modules. require('strict') local makeFileLink = require('Module:File link')._main local effectiveProtectionLevel = require('Module:Effective protection level')._main local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main local yesno = require('Module:Yesno') -- Lazily initialise modules and..." Scribunto text/plain -- This module implements {{pp-meta}} and its daughter templates such as -- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}. -- Initialise necessary modules. require('strict') local makeFileLink = require('Module:File link')._main local effectiveProtectionLevel = require('Module:Effective protection level')._main local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main local yesno = require('Module:Yesno') -- Lazily initialise modules and objects we don't always need. local getArgs, makeMessageBox, lang -- Set constants. local CONFIG_MODULE = 'Module:Protection banner/config' -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function makeCategoryLink(cat, sort) if cat then return string.format( '[[%s:%s|%s]]', mw.site.namespaces[14].name, cat, sort ) end end -- Validation function for the expiry and the protection date local function validateDate(dateString, dateType) if not lang then lang = mw.language.getContentLanguage() end local success, result = pcall(lang.formatDate, lang, 'U', dateString) if success then result = tonumber(result) if result then return result end end error(string.format( 'invalid %s: %s', dateType, tostring(dateString) ), 4) end local function makeFullUrl(page, query, display) return string.format( '[%s %s]', tostring(mw.uri.fullUrl(page, query)), display ) end -- Given a directed graph formatted as node -> table of direct successors, -- get a table of all nodes reachable from a given node (though always -- including the given node). local function getReachableNodes(graph, start) local toWalk, retval = {[start] = true}, {} while true do -- Can't use pairs() since we're adding and removing things as we're iterating local k = next(toWalk) -- This always gets the "first" key if k == nil then return retval end toWalk[k] = nil retval[k] = true for _,v in ipairs(graph[k]) do if not retval[v] then toWalk[v] = true end end end end -------------------------------------------------------------------------------- -- Protection class -------------------------------------------------------------------------------- local Protection = {} Protection.__index = Protection Protection.supportedActions = { edit = true, move = true, autoreview = true, upload = true } Protection.bannerConfigFields = { 'text', 'explanation', 'tooltip', 'alt', 'link', 'image' } function Protection.new(args, cfg, title) local obj = {} obj._cfg = cfg obj.title = title or mw.title.getCurrentTitle() -- Set action if not args.action then obj.action = 'edit' elseif Protection.supportedActions[args.action] then obj.action = args.action else error(string.format( 'invalid action: %s', tostring(args.action) ), 3) end -- Set level obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title) if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then -- Users need to be autoconfirmed to move pages anyway, so treat -- semi-move-protected pages as unprotected. obj.level = '*' end -- Set expiry local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title) if effectiveExpiry == 'infinity' then obj.expiry = 'indef' elseif effectiveExpiry ~= 'unknown' then obj.expiry = validateDate(effectiveExpiry, 'expiry date') end -- Set reason if args[1] then obj.reason = mw.ustring.lower(args[1]) if obj.reason:find('|') then error('reasons cannot contain the pipe character ("|")', 3) end end -- Set protection date if args.date then obj.protectionDate = validateDate(args.date, 'protection date') end -- Set banner config do obj.bannerConfig = {} local configTables = {} if cfg.banners[obj.action] then configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason] end if cfg.defaultBanners[obj.action] then configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level] configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default end configTables[#configTables + 1] = cfg.masterBanner for i, field in ipairs(Protection.bannerConfigFields) do for j, t in ipairs(configTables) do if t[field] then obj.bannerConfig[field] = t[field] break end end end end return setmetatable(obj, Protection) end function Protection:isUserScript() -- Whether the page is a user JavaScript or CSS page. local title = self.title return title.namespace == 2 and ( title.contentModel == 'javascript' or title.contentModel == 'css' ) end function Protection:isProtected() return self.level ~= '*' end function Protection:shouldShowLock() -- Whether we should output a banner/padlock return self:isProtected() and not self:isUserScript() end -- Whether this page needs a protection category. Protection.shouldHaveProtectionCategory = Protection.shouldShowLock function Protection:isTemporary() return type(self.expiry) == 'number' end function Protection:makeProtectionCategory() if not self:shouldHaveProtectionCategory() then return '' end local cfg = self._cfg local title = self.title -- Get the expiry key fragment. local expiryFragment if self.expiry == 'indef' then expiryFragment = self.expiry elseif type(self.expiry) == 'number' then expiryFragment = 'temp' end -- Get the namespace key fragment. local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace] if not namespaceFragment and title.namespace % 2 == 1 then namespaceFragment = 'talk' end -- Define the order that key fragments are tested in. This is done with an -- array of tables containing the value to be tested, along with its -- position in the cfg.protectionCategories table. local order = { {val = expiryFragment, keypos = 1}, {val = namespaceFragment, keypos = 2}, {val = self.reason, keypos = 3}, {val = self.level, keypos = 4}, {val = self.action, keypos = 5} } --[[ -- The old protection templates used an ad-hoc protection category system, -- with some templates prioritising namespaces in their categories, and -- others prioritising the protection reason. To emulate this in this module -- we use the config table cfg.reasonsWithNamespacePriority to set the -- reasons for which namespaces have priority over protection reason. -- If we are dealing with one of those reasons, move the namespace table to -- the end of the order table, i.e. give it highest priority. If not, the -- reason should have highest priority, so move that to the end of the table -- instead. --]] table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3)) --[[ -- Define the attempt order. Inactive subtables (subtables with nil "value" -- fields) are moved to the end, where they will later be given the key -- "all". This is to cut down on the number of table lookups in -- cfg.protectionCategories, which grows exponentially with the number of -- non-nil keys. We keep track of the number of active subtables with the -- noActive parameter. --]] local noActive, attemptOrder do local active, inactive = {}, {} for i, t in ipairs(order) do if t.val then active[#active + 1] = t else inactive[#inactive + 1] = t end end noActive = #active attemptOrder = active for i, t in ipairs(inactive) do attemptOrder[#attemptOrder + 1] = t end end --[[ -- Check increasingly generic key combinations until we find a match. If a -- specific category exists for the combination of key fragments we are -- given, that match will be found first. If not, we keep trying different -- key fragment combinations until we match using the key -- "all-all-all-all-all". -- -- To generate the keys, we index the key subtables using a binary matrix -- with indexes i and j. j is only calculated up to the number of active -- subtables. For example, if there were three active subtables, the matrix -- would look like this, with 0 corresponding to the key fragment "all", and -- 1 corresponding to other key fragments. -- -- j 1 2 3 -- i -- 1 1 1 1 -- 2 0 1 1 -- 3 1 0 1 -- 4 0 0 1 -- 5 1 1 0 -- 6 0 1 0 -- 7 1 0 0 -- 8 0 0 0 -- -- Values of j higher than the number of active subtables are set -- to the string "all". -- -- A key for cfg.protectionCategories is constructed for each value of i. -- The position of the value in the key is determined by the keypos field in -- each subtable. --]] local cats = cfg.protectionCategories for i = 1, 2^noActive do local key = {} for j, t in ipairs(attemptOrder) do if j > noActive then key[t.keypos] = 'all' else local quotient = i / 2 ^ (j - 1) quotient = math.ceil(quotient) if quotient % 2 == 1 then key[t.keypos] = t.val else key[t.keypos] = 'all' end end end key = table.concat(key, '|') local attempt = cats[key] if attempt then return makeCategoryLink(attempt, title.text) end end return '' end function Protection:isIncorrect() local expiry = self.expiry return not self:shouldHaveProtectionCategory() or type(expiry) == 'number' and expiry < os.time() end function Protection:isTemplateProtectedNonTemplate() local action, namespace = self.action, self.title.namespace return self.level == 'templateeditor' and ( (action ~= 'edit' and action ~= 'move') or (namespace ~= 10 and namespace ~= 828) ) end function Protection:makeCategoryLinks() local msg = self._cfg.msg local ret = {self:makeProtectionCategory()} if self:isIncorrect() then ret[#ret + 1] = makeCategoryLink( msg['tracking-category-incorrect'], self.title.text ) end if self:isTemplateProtectedNonTemplate() then ret[#ret + 1] = makeCategoryLink( msg['tracking-category-template'], self.title.text ) end return table.concat(ret) end -------------------------------------------------------------------------------- -- Blurb class -------------------------------------------------------------------------------- local Blurb = {} Blurb.__index = Blurb Blurb.bannerTextFields = { text = true, explanation = true, tooltip = true, alt = true, link = true } function Blurb.new(protectionObj, args, cfg) return setmetatable({ _cfg = cfg, _protectionObj = protectionObj, _args = args }, Blurb) end -- Private methods -- function Blurb:_formatDate(num) -- Formats a Unix timestamp into dd Month, YYYY format. lang = lang or mw.language.getContentLanguage() local success, date = pcall( lang.formatDate, lang, self._cfg.msg['expiry-date-format'] or 'j F Y', '@' .. tostring(num) ) if success then return date end end function Blurb:_getExpandedMessage(msgKey) return self:_substituteParameters(self._cfg.msg[msgKey]) end function Blurb:_substituteParameters(msg) if not self._params then local parameterFuncs = {} parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter parameterFuncs.EDITREQUEST = self._makeEditRequestParameter parameterFuncs.EXPIRY = self._makeExpiryParameter parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter parameterFuncs.IMAGELINK = self._makeImageLinkParameter parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter parameterFuncs.PAGETYPE = self._makePagetypeParameter parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter parameterFuncs.TALKPAGE = self._makeTalkPageParameter parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter parameterFuncs.VANDAL = self._makeVandalTemplateParameter self._params = setmetatable({}, { __index = function (t, k) local param if parameterFuncs[k] then param = parameterFuncs[k](self) end param = param or '' t[k] = param return param end }) end msg = msg:gsub('${(%u+)}', self._params) return msg end function Blurb:_makeCurrentVersionParameter() -- A link to the page history or the move log, depending on the kind of -- protection. local pagename = self._protectionObj.title.prefixedText if self._protectionObj.action == 'move' then -- We need the move log link. return makeFullUrl( 'Special:Log', {type = 'move', page = pagename}, self:_getExpandedMessage('current-version-move-display') ) else -- We need the history link. return makeFullUrl( pagename, {action = 'history'}, self:_getExpandedMessage('current-version-edit-display') ) end end function Blurb:_makeEditRequestParameter() local mEditRequest = require('Module:Submit an edit request') local action = self._protectionObj.action local level = self._protectionObj.level -- Get the edit request type. local requestType if action == 'edit' then if level == 'autoconfirmed' then requestType = 'semi' elseif level == 'extendedconfirmed' then requestType = 'extended' elseif level == 'templateeditor' then requestType = 'template' end end requestType = requestType or 'full' -- Get the display value. local display = self:_getExpandedMessage('edit-request-display') return mEditRequest._link{type = requestType, display = display} end function Blurb:_makeExpiryParameter() local expiry = self._protectionObj.expiry if type(expiry) == 'number' then return self:_formatDate(expiry) else return expiry end end function Blurb:_makeExplanationBlurbParameter() -- Cover special cases first. if self._protectionObj.title.namespace == 8 then -- MediaWiki namespace return self:_getExpandedMessage('explanation-blurb-nounprotect') end -- Get explanation blurb table keys local action = self._protectionObj.action local level = self._protectionObj.level local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject' -- Find the message in the explanation blurb table and substitute any -- parameters. local explanations = self._cfg.explanationBlurbs local msg if explanations[action][level] and explanations[action][level][talkKey] then msg = explanations[action][level][talkKey] elseif explanations[action][level] and explanations[action][level].default then msg = explanations[action][level].default elseif explanations[action].default and explanations[action].default[talkKey] then msg = explanations[action].default[talkKey] elseif explanations[action].default and explanations[action].default.default then msg = explanations[action].default.default else error(string.format( 'could not find explanation blurb for action "%s", level "%s" and talk key "%s"', action, level, talkKey ), 8) end return self:_substituteParameters(msg) end function Blurb:_makeImageLinkParameter() local imageLinks = self._cfg.imageLinks local action = self._protectionObj.action local level = self._protectionObj.level local msg if imageLinks[action][level] then msg = imageLinks[action][level] elseif imageLinks[action].default then msg = imageLinks[action].default else msg = imageLinks.edit.default end return self:_substituteParameters(msg) end function Blurb:_makeIntroBlurbParameter() if self._protectionObj:isTemporary() then return self:_getExpandedMessage('intro-blurb-expiry') else return self:_getExpandedMessage('intro-blurb-noexpiry') end end function Blurb:_makeIntroFragmentParameter() if self._protectionObj:isTemporary() then return self:_getExpandedMessage('intro-fragment-expiry') else return self:_getExpandedMessage('intro-fragment-noexpiry') end end function Blurb:_makePagetypeParameter() local pagetypes = self._cfg.pagetypes return pagetypes[self._protectionObj.title.namespace] or pagetypes.default or error('no default pagetype defined', 8) end function Blurb:_makeProtectionBlurbParameter() local protectionBlurbs = self._cfg.protectionBlurbs local action = self._protectionObj.action local level = self._protectionObj.level local msg if protectionBlurbs[action][level] then msg = protectionBlurbs[action][level] elseif protectionBlurbs[action].default then msg = protectionBlurbs[action].default elseif protectionBlurbs.edit.default then msg = protectionBlurbs.edit.default else error('no protection blurb defined for protectionBlurbs.edit.default', 8) end return self:_substituteParameters(msg) end function Blurb:_makeProtectionDateParameter() local protectionDate = self._protectionObj.protectionDate if type(protectionDate) == 'number' then return self:_formatDate(protectionDate) else return protectionDate end end function Blurb:_makeProtectionLevelParameter() local protectionLevels = self._cfg.protectionLevels local action = self._protectionObj.action local level = self._protectionObj.level local msg if protectionLevels[action][level] then msg = protectionLevels[action][level] elseif protectionLevels[action].default then msg = protectionLevels[action].default elseif protectionLevels.edit.default then msg = protectionLevels.edit.default else error('no protection level defined for protectionLevels.edit.default', 8) end return self:_substituteParameters(msg) end function Blurb:_makeProtectionLogParameter() local pagename = self._protectionObj.title.prefixedText if self._protectionObj.action == 'autoreview' then -- We need the pending changes log. return makeFullUrl( 'Special:Log', {type = 'stable', page = pagename}, self:_getExpandedMessage('pc-log-display') ) else -- We need the protection log. return makeFullUrl( 'Special:Log', {type = 'protect', page = pagename}, self:_getExpandedMessage('protection-log-display') ) end end function Blurb:_makeTalkPageParameter() return string.format( '[[%s:%s#%s|%s]]', mw.site.namespaces[self._protectionObj.title.namespace].talk.name, self._protectionObj.title.text, self._args.section or 'top', self:_getExpandedMessage('talk-page-link-display') ) end function Blurb:_makeTooltipBlurbParameter() if self._protectionObj:isTemporary() then return self:_getExpandedMessage('tooltip-blurb-expiry') else return self:_getExpandedMessage('tooltip-blurb-noexpiry') end end function Blurb:_makeTooltipFragmentParameter() if self._protectionObj:isTemporary() then return self:_getExpandedMessage('tooltip-fragment-expiry') else return self:_getExpandedMessage('tooltip-fragment-noexpiry') end end function Blurb:_makeVandalTemplateParameter() return mw.getCurrentFrame():expandTemplate{ title="vandal-m", args={self._args.user or self._protectionObj.title.baseText} } end -- Public methods -- function Blurb:makeBannerText(key) -- Validate input. if not key or not Blurb.bannerTextFields[key] then error(string.format( '"%s" is not a valid banner config field', tostring(key) ), 2) end -- Generate the text. local msg = self._protectionObj.bannerConfig[key] if type(msg) == 'string' then return self:_substituteParameters(msg) elseif type(msg) == 'function' then msg = msg(self._protectionObj, self._args) if type(msg) ~= 'string' then error(string.format( 'bad output from banner config function with key "%s"' .. ' (expected string, got %s)', tostring(key), type(msg) ), 4) end return self:_substituteParameters(msg) end end -------------------------------------------------------------------------------- -- BannerTemplate class -------------------------------------------------------------------------------- local BannerTemplate = {} BannerTemplate.__index = BannerTemplate function BannerTemplate.new(protectionObj, cfg) local obj = {} obj._cfg = cfg -- Set the image filename. local imageFilename = protectionObj.bannerConfig.image if imageFilename then obj._imageFilename = imageFilename else -- If an image filename isn't specified explicitly in the banner config, -- generate it from the protection status and the namespace. local action = protectionObj.action local level = protectionObj.level local namespace = protectionObj.title.namespace local reason = protectionObj.reason -- Deal with special cases first. if ( namespace == 10 or namespace == 828 or reason and obj._cfg.indefImageReasons[reason] ) and action == 'edit' and level == 'sysop' and not protectionObj:isTemporary() then -- Fully protected modules and templates get the special red "indef" -- padlock. obj._imageFilename = obj._cfg.msg['image-filename-indef'] else -- Deal with regular protection types. local images = obj._cfg.images if images[action] then if images[action][level] then obj._imageFilename = images[action][level] elseif images[action].default then obj._imageFilename = images[action].default end end end end return setmetatable(obj, BannerTemplate) end function BannerTemplate:renderImage() local filename = self._imageFilename or self._cfg.msg['image-filename-default'] or 'Transparent.gif' return makeFileLink{ file = filename, size = (self.imageWidth or 20) .. 'px', alt = self._imageAlt, link = self._imageLink, caption = self.imageCaption } end -------------------------------------------------------------------------------- -- Banner class -------------------------------------------------------------------------------- local Banner = setmetatable({}, BannerTemplate) Banner.__index = Banner function Banner.new(protectionObj, blurbObj, cfg) local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. obj.imageWidth = 40 obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip. obj._reasonText = blurbObj:makeBannerText('text') obj._explanationText = blurbObj:makeBannerText('explanation') obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing. return setmetatable(obj, Banner) end function Banner:__tostring() -- Renders the banner. makeMessageBox = makeMessageBox or require('Module:Message box').main local reasonText = self._reasonText or error('no reason text set', 2) local explanationText = self._explanationText local mbargs = { page = self._page, type = 'protection', image = self:renderImage(), text = string.format( "'''%s'''%s", reasonText, explanationText and '<br />' .. explanationText or '' ) } return makeMessageBox('mbox', mbargs) end -------------------------------------------------------------------------------- -- Padlock class -------------------------------------------------------------------------------- local Padlock = setmetatable({}, BannerTemplate) Padlock.__index = Padlock function Padlock.new(protectionObj, blurbObj, cfg) local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. obj.imageWidth = 20 obj.imageCaption = blurbObj:makeBannerText('tooltip') obj._imageAlt = blurbObj:makeBannerText('alt') obj._imageLink = blurbObj:makeBannerText('link') obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action] or cfg.padlockIndicatorNames.default or 'pp-default' return setmetatable(obj, Padlock) end function Padlock:__tostring() local frame = mw.getCurrentFrame() -- The nowiki tag helps prevent whitespace at the top of articles. return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{ name = 'indicator', args = {name = self._indicatorName}, content = self:renderImage() } end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} function p._exportClasses() -- This is used for testing purposes. return { Protection = Protection, Blurb = Blurb, BannerTemplate = BannerTemplate, Banner = Banner, Padlock = Padlock, } end function p._main(args, cfg, title) args = args or {} cfg = cfg or require(CONFIG_MODULE) local protectionObj = Protection.new(args, cfg, title) local ret = {} -- If a page's edit protection is equally or more restrictive than its -- protection from some other action, then don't bother displaying anything -- for the other action (except categories). if not yesno(args.catonly) and (protectionObj.action == 'edit' or args.demolevel or not getReachableNodes( cfg.hierarchy, protectionObj.level )[effectiveProtectionLevel('edit', protectionObj.title)]) then -- Initialise the blurb object local blurbObj = Blurb.new(protectionObj, args, cfg) -- Render the banner if protectionObj:shouldShowLock() then ret[#ret + 1] = tostring( (yesno(args.small) and Padlock or Banner) .new(protectionObj, blurbObj, cfg) ) end end -- Render the categories if yesno(args.category) ~= false then ret[#ret + 1] = protectionObj:makeCategoryLinks() end return table.concat(ret) end function p.main(frame, cfg) cfg = cfg or require(CONFIG_MODULE) -- Find default args, if any. local parent = frame.getParent and frame:getParent() local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')] -- Find user args, and use the parent frame if we are being called from a -- wrapper template. getArgs = getArgs or require('Module:Arguments').getArgs local userArgs = getArgs(frame, { parentOnly = defaultArgs, frameOnly = not defaultArgs }) -- Build the args table. User-specified args overwrite default args. local args = {} for k, v in pairs(defaultArgs or {}) do args[k] = v end for k, v in pairs(userArgs) do args[k] = v end return p._main(args, cfg) end return p 894f0884d4c2da1ce19d385b96f59af654b0946a Module:Protection banner/doc 828 53 69 2023-10-07T16:43:49Z Silentg 2 Created page with "{{High-use}} {{Module rating|protected}} {{Lua|Module:Protection banner/config|Module:File link|Module:Effective protection level|Module:Effective protection expiry|Module:Yesno|Module:Arguments|Module:Message box|Module:Submit an edit request}} This module creates protection banners and padlock icons that are placed at the top of [[Help:Protection|protected pages]]. == Usage == Most users will not need to use this module directly. For adding protection templates to pa..." wikitext text/x-wiki {{High-use}} {{Module rating|protected}} {{Lua|Module:Protection banner/config|Module:File link|Module:Effective protection level|Module:Effective protection expiry|Module:Yesno|Module:Arguments|Module:Message box|Module:Submit an edit request}} This module creates protection banners and padlock icons that are placed at the top of [[Help:Protection|protected pages]]. == Usage == Most users will not need to use this module directly. For adding protection templates to pages you can use the {{tl|pp}} template, or you may find it more convenient to use one of the more specific protection templates in the table below. {{protection templates}} === From wikitext === &#123;{#invoke:Protection banner|main | 1 = ''reason'' | small = ''yes/no'' | action = ''action'' | date = ''protection date'' | user = ''username'' | section = ''talk page section name'' | category = ''yes'' }&#125; The #invoke syntax can be used for creating protection templates more specific than {{tl|pp}}. For example, it is possible to create a protection template which always shows a padlock icon by using the code <code><nowiki>{{#invoke:Protection banner|main|small=yes}}</nowiki></code>. Pages which call this template will still be able to use other arguments, like ''action''. However, this only works one level deep; a page calling a template which calls another template containing the above code will not automatically be able to use parameters like ''action''. '''''Note:''' You should no longer specify the expiry, as it is automatically retrieved in all cases.'' === From Lua === First, load the module. <syntaxhighlight lang="lua"> local mProtectionBanner = require('Module:Protection banner') </syntaxhighlight> Then you can make protection banners by using the _main function. <syntaxhighlight lang="lua"> mProtectionBanner._main(args, cfg, titleObj) </syntaxhighlight> <var>args</var> is a table of arguments to pass to the module. For possible keys and values for this table, see the [[#Parameters|parameters section]]. The <var>cfg</var> and <var>titleObj</var> variables are intended only for testing; <var>cfg</var> specifies a customised config table to use instead of [[Module:Protection banner/config]], and <var>titleObj</var> specifies a mw.title object to use instead of the current title. <var>args</var>, <var>cfg</var> and <var>titleObj</var> are all optional. == Parameters == All parameters are optional. * '''1''' – the reason that the page was protected. If set, this must be one of the values listed in the [[#Reasons|reasons table]]. * '''small''' – if set to "yes", "y", "1", or "true", a padlock icon is generated instead of a full protection banner. * '''action''' – the protection action. Must be one of "edit" (for normal protection), "move" (for move-protection) or "autoreview" (for pending changes). The default value is "edit". * '''date''' – the protection date. This must be valid input to the second parameter of the [[mw:Help:Extension:ParserFunctions##time|#time parser function]]. This argument has an effect for reasons that use the PROTECTIONDATE parameter in their configuration. As of July 2014, those were the "office" and "reset" reasons. * '''user''' – the username of the user to generate links for. As of July 2014, this only has an effect when the "usertalk" reason is specified. * '''section''' – the section name of the protected page's talk page where discussion is taking place. This works for most, but not all, values of ''reason''. * '''category''' – categories are suppressed if this is set to "no", "n", "0", or "false". * '''catonly''' – if set to "yes", "y", "1", or "true", will only return the protection categories, and not return the banner or padlock. This has no visible output. == Reasons == The following table contains the available reasons, plus the actions for which they are available. {{#invoke:Protection banner/documentation|reasonTable}} == Errors == Below is a list of some of the common errors that this module can produce, and how to fix them. === Invalid protection date === {{error|Error: invalid protection date ("abc")}} This error is produced if you supply a {{para|date}} parameter value that is not recognised as a valid date by the #time parser function. If in doubt, you can just use a date in the format "dd Month YYYY", e.g. "{{#time:j F Y|+ 1 week}}". To see a full range of valid inputs, see the [[mw:Help:Extension:ParserFunctions##time|#time documentation]] (only the first parameter, the ''format string'', may be specified). === Invalid action === {{error|Error: invalid action ("abc")}} This error is produced if you specify an invalid protection action. There are only three valid actions: <code>edit</code> (the default, for normal protection), <code>move</code> (for move-protection), and <code>autoreview</code> (for [[WP:PC|pending changes]]). This should only be possible if you are using a template that supports manually specifying the protection action, such as {{tl|pp}}, or if you are using #invoke directly. If this is not the case, please leave a message on [[Module talk:Protection banner]]. === Reasons cannot contain the pipe character === {{error|Error: reasons cannot contain the pipe character ("&#124;")}} This error is produced if you specify a reason using the {{para|1}} parameter that includes a pipe character ("&#124;"). Please check that you are not entering the {{tl|!}} template into this parameter by mistake. The pipe character is disallowed as the module uses it internally. A list of valid reasons can be seen in the [[#Reasons|reasons section]]. === Other errors === If you see an error other than the ones above, it is likely to either be a bug in the module or mistake in the configuration. Please post a message about it at [[Module talk:Protection banner]]. == Technical details == This module uses configuration data from [[Module:Protection banner/config]]. Most of the module's behaviour can be configured there, making it easily portable across different wikis and different languages. General test cases for the module can be found at [[w:en:Module:Protection banner/testcases|Module:Protection banner/testcases]], and test cases specific to enwiki's config can be found at [[w:en:Module:Protection banner/config/testcases|Module:Protection banner/config/testcases]]. Bug reports and feature requests should be made on [[w:en:Module talk:Protection banner|the module's talk page]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly> 6e22713a5ed5ffde7ca29e24885818a867747803 Module:Protection banner/config 828 54 70 2023-10-07T16:47:04Z Silentg 2 Created page with "-- This module provides configuration data for [[Module:Protection banner]]. return { -------------------------------------------------------------------------------- -- -- BANNER DATA -- -------------------------------------------------------------------------------- --[[ -- Banner data consists of six fields: -- * text - the main protection text that appears at the top of protection -- banners. -- * explanation - the text that appear..." Scribunto text/plain -- This module provides configuration data for [[Module:Protection banner]]. return { -------------------------------------------------------------------------------- -- -- BANNER DATA -- -------------------------------------------------------------------------------- --[[ -- Banner data consists of six fields: -- * text - the main protection text that appears at the top of protection -- banners. -- * explanation - the text that appears below the main protection text, used -- to explain the details of the protection. -- * tooltip - the tooltip text you see when you move the mouse over a small -- padlock icon. -- * link - the page that the small padlock icon links to. -- * alt - the alt text for the small padlock icon. This is also used as tooltip -- text for the large protection banners. -- * image - the padlock image used in both protection banners and small padlock -- icons. -- -- The module checks in three separate tables to find a value for each field. -- First it checks the banners table, which has values specific to the reason -- for the page being protected. Then the module checks the defaultBanners -- table, which has values specific to each protection level. Finally, the -- module checks the masterBanner table, which holds data for protection -- templates to use if no data has been found in the previous two tables. -- -- The values in the banner data can take parameters. These are specified -- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name -- enclosed in curly braces). -- -- Available parameters: -- -- ${CURRENTVERSION} - a link to the page history or the move log, with the -- display message "current-version-edit-display" or -- "current-version-move-display". -- -- ${EDITREQUEST} - a link to create an edit request for the current page. -- -- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes -- on the talk page; you may submit a request to ask an administrator to make -- an edit if it is minor or supported by consensus." -- -- ${IMAGELINK} - a link to set the image to, depending on the protection -- action and protection level. -- -- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry -- is set. E.g. "Editing of this page by new or unregistered users is currently -- disabled until dd Month YYYY." -- -- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation -- so that it can be used in run-on sentences. -- -- ${PAGETYPE} - the type of the page, e.g. "article" or "template". -- Defined in the cfg.pagetypes table. -- -- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g. -- "Editing of this page by new or unregistered users is currently disabled" -- -- ${PROTECTIONDATE} - the protection date, if it has been supplied to the -- template. -- -- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or -- "semi-protected". -- -- ${PROTECTIONLOG} - a link to the protection log or the pending changes log, -- depending on the protection action. -- -- ${TALKPAGE} - a link to the talk page. If a section is specified, links -- straight to that talk page section. -- -- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to -- create a blurb like "This template is semi-protected", or "This article is -- move-protected until DD Month YYYY". -- -- ${VANDAL} - links for the specified username (or the root page name) -- using Module:Vandal-m. -- -- Functions -- -- For advanced users, it is possible to use Lua functions instead of strings -- in the banner config tables. Using functions gives flexibility that is not -- possible just by using parameters. Functions take two arguments, the -- protection object and the template arguments, and they must output a string. -- -- For example: -- -- text = function (protectionObj, args) -- if protectionObj.level == 'autoconfirmed' then -- return 'foo' -- else -- return 'bar' -- end -- end -- -- Some protection object properties and methods that may be useful: -- protectionObj.action - the protection action -- protectionObj.level - the protection level -- protectionObj.reason - the protection reason -- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set -- to indefinite, and the protection time in unix time if temporary. -- protectionObj.protectionDate - the protection date in unix time, or nil if -- unspecified. -- protectionObj.bannerConfig - the banner config found by the module. Beware -- of editing the config field used by the function, as it could create an -- infinite loop. -- protectionObj:isProtected - returns a boolean showing whether the page is -- protected. -- protectionObj:isTemporary - returns a boolean showing whether the expiry is -- temporary. -- protectionObj:isIncorrect - returns a boolean showing whether the protection -- template is incorrect. --]] -- The master banner data, used if no values have been found in banners or -- defaultBanners. masterBanner = { text = '${INTROBLURB}', explanation = '${EXPLANATIONBLURB}', tooltip = '${TOOLTIPBLURB}', link = '${IMAGELINK}', alt = 'Page ${PROTECTIONLEVEL}' }, -- The default banner data. This holds banner data for different protection -- levels. -- *required* - this table needs edit, move, autoreview and upload subtables. defaultBanners = { edit = {}, move = {}, autoreview = { default = { alt = 'Page protected with pending changes', tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users', image = 'Pending-protection-shackle.svg' } }, upload = {} }, -- The banner data. This holds banner data for different protection reasons. -- In fact, the reasons specified in this table control which reasons are -- valid inputs to the first positional parameter. -- -- There is also a non-standard "description" field that can be used for items -- in this table. This is a description of the protection reason for use in the -- module documentation. -- -- *required* - this table needs edit, move, autoreview and upload subtables. banners = { edit = { blp = { description = 'For pages protected to promote compliance with the' .. ' [[Wikipedia:Biographies of living persons' .. '|biographies of living persons]] policy', text = '${INTROFRAGMENT} to promote compliance with' .. ' [[Wikipedia:Biographies of living persons' .. "|Wikipedia's&nbsp;policy on&nbsp;the&nbsp;biographies" .. ' of&nbsp;living&nbsp;people]].', tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on' .. ' biographies of living persons', }, dmca = { description = 'For pages protected by the Wikimedia Foundation' .. ' due to [[Digital Millennium Copyright Act]] takedown requests', explanation = function (protectionObj, args) local ret = 'Pursuant to a rights owner notice under the Digital' .. ' Millennium Copyright Act (DMCA) regarding some content' .. ' in this article, the Wikimedia Foundation acted under' .. ' applicable law and took down and restricted the content' .. ' in question.' if args.notice then ret = ret .. ' A copy of the received notice can be found here: ' .. args.notice .. '.' end ret = ret .. ' For more information, including websites discussing' .. ' how to file a counter-notice, please see' .. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}." .. "'''Do not remove this template from the article until the" .. " restrictions are withdrawn'''." return ret end, image = 'Office-protection-shackle.svg', }, dispute = { description = 'For pages protected due to editing disputes', text = function (protectionObj, args) -- Find the value of "disputes". local display = 'disputes' local disputes if args.section then disputes = string.format( '[[%s:%s#%s|%s]]', mw.site.namespaces[protectionObj.title.namespace].talk.name, protectionObj.title.text, args.section, display ) else disputes = display end -- Make the blurb, depending on the expiry. local msg if type(protectionObj.expiry) == 'number' then msg = '${INTROFRAGMENT} or until editing %s have been resolved.' else msg = '${INTROFRAGMENT} until editing %s have been resolved.' end return string.format(msg, disputes) end, explanation = "This protection is '''not''' an endorsement of the" .. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}', tooltip = '${TOOLTIPFRAGMENT} due to editing disputes', }, ecp = { description = 'For articles in topic areas authorized by' .. ' [[Wikipedia:Arbitration Committee|ArbCom]] or' .. ' meets the criteria for community use', tooltip = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}', alt = 'Extended-protected ${PAGETYPE}', }, mainpage = { description = 'For pages protected for being displayed on the [[Main Page]]', text = 'This file is currently' .. ' [[Wikipedia:This page is protected|protected]] from' .. ' editing because it is currently or will soon be displayed' .. ' on the [[Main Page]].', explanation = 'Images on the Main Page are protected due to their high' .. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.' .. '<br /><span style="font-size:90%;">' .. "'''Administrators:''' Once this image is definitely off the Main Page," .. ' please unprotect this file, or reduce to semi-protection,' .. ' as appropriate.</span>', }, office = { description = 'For pages protected by the Wikimedia Foundation', text = function (protectionObj, args) local ret = 'This ${PAGETYPE} is currently under the' .. ' scrutiny of the' .. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]' .. ' and is protected.' if protectionObj.protectionDate then ret = ret .. ' It has been protected since ${PROTECTIONDATE}.' end return ret end, explanation = "If you can edit this page, please discuss all changes and" .. " additions on the ${TALKPAGE} first. '''Do not remove protection from this" .. " page unless you are authorized by the Wikimedia Foundation to do" .. " so.'''", image = 'Office-protection-shackle.svg', }, reset = { description = 'For pages protected by the Wikimedia Foundation and' .. ' "reset" to a bare-bones version', text = 'This ${PAGETYPE} is currently under the' .. ' scrutiny of the' .. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]' .. ' and is protected.', explanation = function (protectionObj, args) local ret = '' if protectionObj.protectionDate then ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was' else ret = ret .. 'This ${PAGETYPE} has been' end ret = ret .. ' reduced to a' .. ' simplified, "bare bones" version so that it may be completely' .. ' rewritten to ensure it meets the policies of' .. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].' .. ' Standard Wikipedia policies will apply to its rewriting—which' .. ' will eventually be open to all editors—and will be strictly' .. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while' .. ' it is being rebuilt.\n\n' .. 'Any insertion of material directly from' .. ' pre-protection revisions of the ${PAGETYPE} will be removed, as' .. ' will any material added to the ${PAGETYPE} that is not properly' .. ' sourced. The associated talk page(s) were also cleared on the' .. " same date.\n\n" .. "If you can edit this page, please discuss all changes and" .. " additions on the ${TALKPAGE} first. '''Do not override" .. " this action, and do not remove protection from this page," .. " unless you are authorized by the Wikimedia Foundation" .. " to do so. No editor may remove this notice.'''" return ret end, image = 'Office-protection-shackle.svg', }, sock = { description = 'For pages protected due to' .. ' [[Wikipedia:Sock puppetry|sock puppetry]]', text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of' .. ' [[Wikipedia:Blocking policy|blocked]] or' .. ' [[Wikipedia:Banning policy|banned users]]' .. ' from editing it.', tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from' .. ' editing it', }, template = { description = 'For [[Wikipedia:High-risk templates|high-risk]]' .. ' templates and Lua modules', text = 'This is a permanently [[Help:Protection|protected]] ${PAGETYPE},' .. ' as it is [[Wikipedia:High-risk templates|high-risk]].', explanation = 'Please discuss any changes on the ${TALKPAGE}; you may' .. ' ${EDITREQUEST} to ask an' .. ' [[Wikipedia:Administrators|administrator]] or' .. ' [[Wikipedia:Template editor|template editor]] to make an edit if' .. ' it is [[Help:Minor edit#When to mark an edit as a minor edit' .. '|uncontroversial]] or supported by' .. ' [[Wikipedia:Consensus|consensus]]. You can also' .. ' [[Wikipedia:Requests for page protection|request]] that the page be' .. ' unprotected.', tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}' .. ' to prevent vandalism', alt = 'Permanently protected ${PAGETYPE}', }, usertalk = { description = 'For pages protected against disruptive edits by a' .. ' particular user', text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,' .. ' such as abusing the' .. ' &#123;&#123;[[Template:unblock|unblock]]&#125;&#125; template.', explanation = 'If you cannot edit this user talk page and you need to' .. ' make a change or leave a message, you can' .. ' [[Wikipedia:Requests for page protection' .. '#Current requests for edits to a protected page' .. '|request an edit]],' .. ' [[Wikipedia:Requests for page protection' .. '#Current requests for reduction in protection level' .. '|request unprotection]],' .. ' [[Special:Userlogin|log in]],' .. ' or [[Special:UserLogin/signup|create an account]].', }, vandalism = { description = 'For pages protected against' .. ' [[Wikipedia:Vandalism|vandalism]]', text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].', explanation = function (protectionObj, args) local ret = '' if protectionObj.level == 'sysop' then ret = ret .. "This protection is '''not''' an endorsement of the" .. ' ${CURRENTVERSION}. ' end return ret .. '${EXPLANATIONBLURB}' end, tooltip = '${TOOLTIPFRAGMENT} due to vandalism', } }, move = { dispute = { description = 'For pages protected against page moves due to' .. ' disputes over the page title', explanation = "This protection is '''not''' an endorsement of the" .. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}', image = 'Move-protection-shackle.svg' }, vandalism = { description = 'For pages protected against' .. ' [[Wikipedia:Vandalism#Page-move vandalism' .. ' |page-move vandalism]]' } }, autoreview = {}, upload = {} }, -------------------------------------------------------------------------------- -- -- GENERAL DATA TABLES -- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Protection blurbs -------------------------------------------------------------------------------- -- This table produces the protection blurbs available with the -- ${PROTECTIONBLURB} parameter. It is sorted by protection action and -- protection level, and is checked by the module in the following order: -- 1. page's protection action, page's protection level -- 2. page's protection action, default protection level -- 3. "edit" protection action, default protection level -- -- It is possible to use banner parameters inside this table. -- *required* - this table needs edit, move, autoreview and upload subtables. protectionBlurbs = { edit = { default = 'This ${PAGETYPE} is currently [[Help:Protection|' .. 'protected]] from editing', autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access' .. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered' .. ' users|unregistered]] users is currently [[Help:Protection|disabled]]', extendedconfirmed = 'This ${PAGETYPE} is currently under extended confirmed protection', }, move = { default = 'This ${PAGETYPE} is currently [[Help:Protection|protected]]' .. ' from [[Help:Moving a page|page moves]]' }, autoreview = { default = 'All edits made to this ${PAGETYPE} by' .. ' [[Wikipedia:User access levels#New users|new]] or' .. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]' .. ' users are currently' .. ' [[Wikipedia:Pending changes|subject to review]]' }, upload = { default = 'Uploading new versions of this ${PAGETYPE} is currently disabled' } }, -------------------------------------------------------------------------------- -- Explanation blurbs -------------------------------------------------------------------------------- -- This table produces the explanation blurbs available with the -- ${EXPLANATIONBLURB} parameter. It is sorted by protection action, -- protection level, and whether the page is a talk page or not. If the page is -- a talk page it will have a talk key of "talk"; otherwise it will have a talk -- key of "subject". The table is checked in the following order: -- 1. page's protection action, page's protection level, page's talk key -- 2. page's protection action, page's protection level, default talk key -- 3. page's protection action, default protection level, page's talk key -- 4. page's protection action, default protection level, default talk key -- -- It is possible to use banner parameters inside this table. -- *required* - this table needs edit, move, autoreview and upload subtables. explanationBlurbs = { edit = { autoconfirmed = { subject = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details. If you' .. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can' .. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},' .. ' [[Wikipedia:Requests for page protection' .. '#Current requests for reduction in protection level' .. '|request unprotection]], [[Special:Userlogin|log in]], or' .. ' [[Special:UserLogin/signup|create an account]].', default = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details. If you' .. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can' .. ' [[Wikipedia:Requests for page protection' .. '#Current requests for reduction in protection level' .. '|request unprotection]], [[Special:Userlogin|log in]], or' .. ' [[Special:UserLogin/signup|create an account]].', }, extendedconfirmed = { default = 'Extended confirmed protection prevents edits from all unregistered editors' .. ' and registered users with fewer than 30 days tenure and 500 edits.' .. ' The [[Wikipedia:Protection policy#extended|policy on community use]]' .. ' specifies that extended confirmed protection can be applied to combat' .. ' disruption, if semi-protection has proven to be ineffective.' .. ' Extended confirmed protection may also be applied to enforce' .. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].' .. ' Please discuss any changes on the ${TALKPAGE}; you may' .. ' ${EDITREQUEST} to ask for uncontroversial changes supported by' .. ' [[Wikipedia:Consensus|consensus]].' }, default = { subject = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' Please discuss any changes on the ${TALKPAGE}; you' .. ' may ${EDITREQUEST} to ask an' .. ' [[Wikipedia:Administrators|administrator]] to make an edit if it' .. ' is [[Help:Minor edit#When to mark an edit as a minor edit' .. '|uncontroversial]] or supported by [[Wikipedia:Consensus' .. '|consensus]]. You may also [[Wikipedia:Requests for' .. ' page protection#Current requests for reduction in protection level' .. '|request]] that this page be unprotected.', default = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' You may [[Wikipedia:Requests for page' .. ' protection#Current requests for edits to a protected page|request an' .. ' edit]] to this page, or [[Wikipedia:Requests for' .. ' page protection#Current requests for reduction in protection level' .. '|ask]] for it to be unprotected.' } }, move = { default = { subject = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' The page may still be edited but cannot be moved' .. ' until unprotected. Please discuss any suggested moves on the' .. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also' .. ' [[Wikipedia:Requests for page protection|request]] that the page be' .. ' unprotected.', default = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' The page may still be edited but cannot be moved' .. ' until unprotected. Please discuss any suggested moves at' .. ' [[Wikipedia:Requested moves]]. You can also' .. ' [[Wikipedia:Requests for page protection|request]] that the page be' .. ' unprotected.' } }, autoreview = { default = { default = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' Edits to this ${PAGETYPE} by new and unregistered users' .. ' will not be visible to readers until they are accepted by' .. ' a reviewer. To avoid the need for your edits to be' .. ' reviewed, you may' .. ' [[Wikipedia:Requests for page protection' .. '#Current requests for reduction in protection level' .. '|request unprotection]], [[Special:Userlogin|log in]], or' .. ' [[Special:UserLogin/signup|create an account]].' }, }, upload = { default = { default = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' The page may still be edited but new versions of the file' .. ' cannot be uploaded until it is unprotected. You can' .. ' request that a new version be uploaded by using a' .. ' [[Wikipedia:Edit requests|protected edit request]], or you' .. ' can [[Wikipedia:Requests for page protection|request]]' .. ' that the file be unprotected.' } } }, -------------------------------------------------------------------------------- -- Protection levels -------------------------------------------------------------------------------- -- This table provides the data for the ${PROTECTIONLEVEL} parameter, which -- produces a short label for different protection levels. It is sorted by -- protection action and protection level, and is checked in the following -- order: -- 1. page's protection action, page's protection level -- 2. page's protection action, default protection level -- 3. "edit" protection action, default protection level -- -- It is possible to use banner parameters inside this table. -- *required* - this table needs edit, move, autoreview and upload subtables. protectionLevels = { edit = { default = 'protected', templateeditor = 'template-protected', extendedconfirmed = 'extended-protected', autoconfirmed = 'semi-protected', }, move = { default = 'move-protected' }, autoreview = { }, upload = { default = 'upload-protected' } }, -------------------------------------------------------------------------------- -- Images -------------------------------------------------------------------------------- -- This table lists different padlock images for each protection action and -- protection level. It is used if an image is not specified in any of the -- banner data tables, and if the page does not satisfy the conditions for using -- the ['image-filename-indef'] image. It is checked in the following order: -- 1. page's protection action, page's protection level -- 2. page's protection action, default protection level images = { edit = { default = 'Full-protection-shackle.svg', templateeditor = 'Template-protection-shackle.svg', extendedconfirmed = 'Extended-protection-shackle.svg', autoconfirmed = 'Semi-protection-shackle.svg' }, move = { default = 'Move-protection-shackle.svg', }, autoreview = { default = 'Pending-protection-shackle.svg' }, upload = { default = 'Upload-protection-shackle.svg' } }, -- Pages with a reason specified in this table will show the special "indef" -- padlock, defined in the 'image-filename-indef' message, if no expiry is set. indefImageReasons = { template = true }, -------------------------------------------------------------------------------- -- Image links -------------------------------------------------------------------------------- -- This table provides the data for the ${IMAGELINK} parameter, which gets -- the image link for small padlock icons based on the page's protection action -- and protection level. It is checked in the following order: -- 1. page's protection action, page's protection level -- 2. page's protection action, default protection level -- 3. "edit" protection action, default protection level -- -- It is possible to use banner parameters inside this table. -- *required* - this table needs edit, move, autoreview and upload subtables. imageLinks = { edit = { default = 'Wikipedia:Protection policy#full', templateeditor = 'Wikipedia:Protection policy#template', extendedconfirmed = 'Wikipedia:Protection policy#extended', autoconfirmed = 'Wikipedia:Protection policy#semi' }, move = { default = 'Wikipedia:Protection policy#move' }, autoreview = { default = 'Wikipedia:Protection policy#pending' }, upload = { default = 'Wikipedia:Protection policy#upload' } }, -------------------------------------------------------------------------------- -- Padlock indicator names -------------------------------------------------------------------------------- -- This table provides the "name" attribute for the <indicator> extension tag -- with which small padlock icons are generated. All indicator tags on a page -- are displayed in alphabetical order based on this attribute, and with -- indicator tags with duplicate names, the last tag on the page wins. -- The attribute is chosen based on the protection action; table keys must be a -- protection action name or the string "default". padlockIndicatorNames = { autoreview = 'pp-autoreview', default = 'pp-default' }, -------------------------------------------------------------------------------- -- Protection categories -------------------------------------------------------------------------------- --[[ -- The protection categories are stored in the protectionCategories table. -- Keys to this table are made up of the following strings: -- -- 1. the expiry date -- 2. the namespace -- 3. the protection reason (e.g. "dispute" or "vandalism") -- 4. the protection level (e.g. "sysop" or "autoconfirmed") -- 5. the action (e.g. "edit" or "move") -- -- When the module looks up a category in the table, first it will will check to -- see a key exists that corresponds to all five parameters. For example, a -- user page semi-protected from vandalism for two weeks would have the key -- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module -- changes the first part of the key to "all" and checks the table again. It -- keeps checking increasingly generic key combinations until it finds the -- field, or until it reaches the key "all-all-all-all-all". -- -- The module uses a binary matrix to determine the order in which to search. -- This is best demonstrated by a table. In this table, the "0" values -- represent "all", and the "1" values represent the original data (e.g. -- "indef" or "file" or "vandalism"). -- -- expiry namespace reason level action -- order -- 1 1 1 1 1 1 -- 2 0 1 1 1 1 -- 3 1 0 1 1 1 -- 4 0 0 1 1 1 -- 5 1 1 0 1 1 -- 6 0 1 0 1 1 -- 7 1 0 0 1 1 -- 8 0 0 0 1 1 -- 9 1 1 1 0 1 -- 10 0 1 1 0 1 -- 11 1 0 1 0 1 -- 12 0 0 1 0 1 -- 13 1 1 0 0 1 -- 14 0 1 0 0 1 -- 15 1 0 0 0 1 -- 16 0 0 0 0 1 -- 17 1 1 1 1 0 -- 18 0 1 1 1 0 -- 19 1 0 1 1 0 -- 20 0 0 1 1 0 -- 21 1 1 0 1 0 -- 22 0 1 0 1 0 -- 23 1 0 0 1 0 -- 24 0 0 0 1 0 -- 25 1 1 1 0 0 -- 26 0 1 1 0 0 -- 27 1 0 1 0 0 -- 28 0 0 1 0 0 -- 29 1 1 0 0 0 -- 30 0 1 0 0 0 -- 31 1 0 0 0 0 -- 32 0 0 0 0 0 -- -- In this scheme the action has the highest priority, as it is the last -- to change, and the expiry has the least priority, as it changes the most. -- The priorities of the expiry, the protection level and the action are -- fixed, but the priorities of the reason and the namespace can be swapped -- through the use of the cfg.bannerDataNamespaceHasPriority table. --]] -- If the reason specified to the template is listed in this table, -- namespace data will take priority over reason data in the protectionCategories -- table. reasonsWithNamespacePriority = { vandalism = true, }, -- The string to use as a namespace key for the protectionCategories table for each -- namespace number. categoryNamespaceKeys = { [ 2] = 'user', [ 3] = 'user', [ 4] = 'project', [ 6] = 'file', [ 8] = 'mediawiki', [ 10] = 'template', [ 12] = 'project', [ 14] = 'category', [100] = 'portal', [828] = 'module', }, protectionCategories = { ['all|all|all|all|all'] = 'Wikipedia fully protected pages', ['all|all|office|all|all'] = 'Wikipedia Office-protected pages', ['all|all|reset|all|all'] = 'Wikipedia Office-protected pages', ['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages', ['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files', ['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages', ['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages', ['all|template|all|all|edit'] = 'Wikipedia fully protected templates', ['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages', ['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages', ['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people', ['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people', ['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute', ['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users', ['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism', ['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories', ['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files', ['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals', ['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages', ['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages', ['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates', ['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages', ['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules', ['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates', ['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates ['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people', ['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people', ['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute', ['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users', ['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism', ['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories', ['all|file|all|sysop|edit'] = 'Wikipedia fully protected files', ['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages', ['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages', ['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates', ['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates', ['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages', ['all|module|all|all|edit'] = 'Wikipedia fully protected modules', ['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules', ['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules', ['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules', ['all|all|all|sysop|move'] = 'Wikipedia move-protected pages', ['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages', ['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute', ['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism', ['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals', ['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages', ['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages', ['all|template|all|sysop|move'] = 'Wikipedia move-protected templates', ['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages', ['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages', ['all|file|all|all|upload'] = 'Wikipedia upload-protected files', }, -------------------------------------------------------------------------------- -- Expiry category config -------------------------------------------------------------------------------- -- This table configures the expiry category behaviour for each protection -- action. -- * If set to true, setting that action will always categorise the page if -- an expiry parameter is not set. -- * If set to false, setting that action will never categorise the page. -- * If set to nil, the module will categorise the page if: -- 1) an expiry parameter is not set, and -- 2) a reason is provided, and -- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck -- table. expiryCheckActions = { edit = nil, move = false, autoreview = true, upload = false }, reasonsWithoutExpiryCheck = { blp = true, template = true, }, -------------------------------------------------------------------------------- -- Pagetypes -------------------------------------------------------------------------------- -- This table produces the page types available with the ${PAGETYPE} parameter. -- Keys are namespace numbers, or the string "default" for the default value. pagetypes = { [0] = 'article', [6] = 'file', [10] = 'template', [14] = 'category', [828] = 'module', default = 'page' }, -------------------------------------------------------------------------------- -- Strings marking indefinite protection -------------------------------------------------------------------------------- -- This table contains values passed to the expiry parameter that mean the page -- is protected indefinitely. indefStrings = { ['indef'] = true, ['indefinite'] = true, ['indefinitely'] = true, ['infinite'] = true, }, -------------------------------------------------------------------------------- -- Group hierarchy -------------------------------------------------------------------------------- -- This table maps each group to all groups that have a superset of the original -- group's page editing permissions. hierarchy = { sysop = {}, reviewer = {'sysop'}, filemover = {'sysop'}, templateeditor = {'sysop'}, extendedconfirmed = {'sysop'}, autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'}, user = {'autoconfirmed'}, ['*'] = {'user'} }, -------------------------------------------------------------------------------- -- Wrapper templates and their default arguments -------------------------------------------------------------------------------- -- This table contains wrapper templates used with the module, and their -- default arguments. Templates specified in this table should contain the -- following invocation, and no other template content: -- -- {{#invoke:Protection banner|main}} -- -- If other content is desired, it can be added between -- <noinclude>...</noinclude> tags. -- -- When a user calls one of these wrapper templates, they will use the -- default arguments automatically. However, users can override any of the -- arguments. wrappers = { ['Template:Pp'] = {}, ['Template:Pp-extended'] = {'ecp'}, ['Template:Pp-blp'] = {'blp'}, -- we don't need Template:Pp-create ['Template:Pp-dispute'] = {'dispute'}, ['Template:Pp-main-page'] = {'mainpage'}, ['Template:Pp-move'] = {action = 'move', catonly = 'yes'}, ['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'}, -- we don't need Template:Pp-move-indef ['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'}, ['Template:Pp-office'] = {'office'}, ['Template:Pp-office-dmca'] = {'dmca'}, ['Template:Pp-pc'] = {action = 'autoreview', small = true}, ['Template:Pp-pc1'] = {action = 'autoreview', small = true}, ['Template:Pp-reset'] = {'reset'}, ['Template:Pp-semi-indef'] = {small = true}, ['Template:Pp-sock'] = {'sock'}, ['Template:Pp-template'] = {'template', small = true}, ['Template:Pp-upload'] = {action = 'upload'}, ['Template:Pp-usertalk'] = {'usertalk'}, ['Template:Pp-vandalism'] = {'vandalism'}, }, -------------------------------------------------------------------------------- -- -- MESSAGES -- -------------------------------------------------------------------------------- msg = { -------------------------------------------------------------------------------- -- Intro blurb and intro fragment -------------------------------------------------------------------------------- -- These messages specify what is produced by the ${INTROBLURB} and -- ${INTROFRAGMENT} parameters. If the protection is temporary they use the -- intro-blurb-expiry or intro-fragment-expiry, and if not they use -- intro-blurb-noexpiry or intro-fragment-noexpiry. -- It is possible to use banner parameters in these messages. ['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.', ['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.', ['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},', ['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}', -------------------------------------------------------------------------------- -- Tooltip blurb -------------------------------------------------------------------------------- -- These messages specify what is produced by the ${TOOLTIPBLURB} parameter. -- If the protection is temporary the tooltip-blurb-expiry message is used, and -- if not the tooltip-blurb-noexpiry message is used. -- It is possible to use banner parameters in these messages. ['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.', ['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.', ['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},', ['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}', -------------------------------------------------------------------------------- -- Special explanation blurb -------------------------------------------------------------------------------- -- An explanation blurb for pages that cannot be unprotected, e.g. for pages -- in the MediaWiki namespace. -- It is possible to use banner parameters in this message. ['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|' .. 'protection policy]] and ${PROTECTIONLOG} for more details.' .. ' Please discuss any changes on the ${TALKPAGE}; you' .. ' may ${EDITREQUEST} to ask an' .. ' [[Wikipedia:Administrators|administrator]] to make an edit if it' .. ' is [[Help:Minor edit#When to mark an edit as a minor edit' .. '|uncontroversial]] or supported by [[Wikipedia:Consensus' .. '|consensus]].', -------------------------------------------------------------------------------- -- Protection log display values -------------------------------------------------------------------------------- -- These messages determine the display values for the protection log link -- or the pending changes log link produced by the ${PROTECTIONLOG} parameter. -- It is possible to use banner parameters in these messages. ['protection-log-display'] = 'protection log', ['pc-log-display'] = 'pending changes log', -------------------------------------------------------------------------------- -- Current version display values -------------------------------------------------------------------------------- -- These messages determine the display values for the page history link -- or the move log link produced by the ${CURRENTVERSION} parameter. -- It is possible to use banner parameters in these messages. ['current-version-move-display'] = 'current title', ['current-version-edit-display'] = 'current version', -------------------------------------------------------------------------------- -- Talk page -------------------------------------------------------------------------------- -- This message determines the display value of the talk page link produced -- with the ${TALKPAGE} parameter. -- It is possible to use banner parameters in this message. ['talk-page-link-display'] = 'talk page', -------------------------------------------------------------------------------- -- Edit requests -------------------------------------------------------------------------------- -- This message determines the display value of the edit request link produced -- with the ${EDITREQUEST} parameter. -- It is possible to use banner parameters in this message. ['edit-request-display'] = 'submit an edit request', -------------------------------------------------------------------------------- -- Expiry date format -------------------------------------------------------------------------------- -- This is the format for the blurb expiry date. It should be valid input for -- the first parameter of the #time parser function. ['expiry-date-format'] = 'F j, Y "at" H:i e', -------------------------------------------------------------------------------- -- Tracking categories -------------------------------------------------------------------------------- -- These messages determine which tracking categories the module outputs. ['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates', ['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules', -------------------------------------------------------------------------------- -- Images -------------------------------------------------------------------------------- -- These are images that are not defined by their protection action and protection level. ['image-filename-indef'] = 'Full-protection-shackle.svg', ['image-filename-default'] = 'Transparent.gif', -------------------------------------------------------------------------------- -- End messages -------------------------------------------------------------------------------- } -------------------------------------------------------------------------------- -- End configuration -------------------------------------------------------------------------------- } a20552ae38cb5253a4fa29aa126abc74215a589f Module:Protection banner/config/doc 828 55 71 2023-10-07T16:47:41Z Silentg 2 Created page with "{{Module rating|protected}} {{High-use}} This module contains configuration data for [[Module:Protection banner]]. For documentation please see the module comments, and if you're not sure how something works you can ask on the [[Module talk:Protection banner|module talk page]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly>" wikitext text/x-wiki {{Module rating|protected}} {{High-use}} This module contains configuration data for [[Module:Protection banner]]. For documentation please see the module comments, and if you're not sure how something works you can ask on the [[Module talk:Protection banner|module talk page]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly> 6d916d45fb7e553daf4457f35dc64035a6ee81b6 Module:File link 828 56 72 2023-10-07T16:48:49Z Silentg 2 Created page with "-- This module provides a library for formatting file wikilinks. local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local p = {} function p._main(args) checkType('_main', 1, args, 'table') -- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our -- own function to get the right error level. local function checkArg(key, val, level) if type(val) ~= 'string' then error(string.format( "type error in..." Scribunto text/plain -- This module provides a library for formatting file wikilinks. local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local p = {} function p._main(args) checkType('_main', 1, args, 'table') -- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our -- own function to get the right error level. local function checkArg(key, val, level) if type(val) ~= 'string' then error(string.format( "type error in '%s' parameter of '_main' (expected string, got %s)", key, type(val) ), level) end end local ret = {} -- Adds a positional parameter to the buffer. local function addPositional(key) local val = args[key] if not val then return nil end checkArg(key, val, 4) ret[#ret + 1] = val end -- Adds a named parameter to the buffer. We assume that the parameter name -- is the same as the argument key. local function addNamed(key) local val = args[key] if not val then return nil end checkArg(key, val, 4) ret[#ret + 1] = key .. '=' .. val end -- Filename checkArg('file', args.file, 3) ret[#ret + 1] = 'File:' .. args.file -- Format if args.format then checkArg('format', args.format) if args.formatfile then checkArg('formatfile', args.formatfile) ret[#ret + 1] = args.format .. '=' .. args.formatfile else ret[#ret + 1] = args.format end end -- Border if yesno(args.border) then ret[#ret + 1] = 'border' end addPositional('location') addPositional('alignment') addPositional('size') addNamed('upright') addNamed('link') addNamed('alt') addNamed('page') addNamed('class') addNamed('lang') addNamed('start') addNamed('end') addNamed('thumbtime') addPositional('caption') return string.format('[[%s]]', table.concat(ret, '|')) end function p.main(frame) local origArgs = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:File link' }) if not origArgs.file then error("'file' parameter missing from [[Template:File link]]", 0) end -- Copy the arguments that were passed to a new table to avoid looking up -- every possible parameter in the frame object. local args = {} for k, v in pairs(origArgs) do -- Make _BLANK a special argument to add a blank parameter. For use in -- conditional templates etc. it is useful for blank arguments to be -- ignored, but we still need a way to specify them so that we can do -- things like [[File:Example.png|link=]]. if v == '_BLANK' then v = '' end args[k] = v end return p._main(args) end return p 66925f088d11530f2482f04181a3baaaa0ad3d0c Module:File link/doc 828 57 73 2023-10-07T16:49:25Z Silentg 2 Created page with "{{high-use}} {{Module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module is used to construct wikitext links to files. It is primarily useful for templates and modules that use complicated logic to make file links. Simple file links should be made with wikitext markup directly, as it uses less resources than calling this module. For help with wikitext file markup please refer to the [[mw:Help:Images|documentation at mediawiki.org]]. == Usage from wikit..." wikitext text/x-wiki {{high-use}} {{Module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module is used to construct wikitext links to files. It is primarily useful for templates and modules that use complicated logic to make file links. Simple file links should be made with wikitext markup directly, as it uses less resources than calling this module. For help with wikitext file markup please refer to the [[mw:Help:Images|documentation at mediawiki.org]]. == Usage from wikitext == From wikitext, this module should be called from a template, usually {{tl|file link}}. Please see the template page for documentation. However, it can also be called using the syntax <code><nowiki>{{#invoke:File link|main|</nowiki>''arguments''<nowiki>}}</nowiki></code>. == Usage from Lua == First, you need to import the module. <syntaxhighlight lang="lua"> local mFileLink = require('Module:File link') </syntaxhighlight> Then you can make file links using the <code>_main</code> function. <syntaxhighlight lang="lua"> mFileLink._main(args) </syntaxhighlight> <var>args</var> is a table of arguments that can have the following keys: * <code>file</code> - the filename. (required) * <code>format</code> - the file format, e.g. 'thumb', 'thumbnail', 'frame', 'framed', or 'frameless'. * <code>formatfile</code> - a filename to specify with the 'thumbnail' format option. The filename specified will be used instead of the automatically generated thumbnail. * <code>border</code> - set this to true or "yes" (or any other value recognized as true by [[Module:Yesno]]) to set a border for the image. * <code>location</code> - the horizontal alignment of the file, e.g. 'right', 'left', 'center', or 'none'. * <code>alignment</code> - the vertical alignment of the file, e.g. 'baseline', 'middle', 'sub', 'super', 'text-top', 'text-bottom', 'top', or 'bottom'. * <code>size</code> - the size of the image, e.g. '100px', 'x100px' or '100x100px'. * <code>upright</code> - the 'upright' parameter, used for setting the size of tall and thin images. * <code>link</code> - the page that the file should link to. Use the blank string <nowiki>''</nowiki> to suppress the default link to the file description page. * <code>alt</code> - the alt text. Use the blank string <nowiki>''</nowiki> to suppress the default alt text. * <code>caption</code> - a caption for the file. * <code>page</code> - sets a page number for multi-paged files such as PDFs. * <code>class</code> - adds a <code>class</code> parameter to image links. The MediaWiki software adds this parameter to the <code>class="..."</code> attribute of the image's <code><nowiki><img /></nowiki></code> element when the page is rendered into HTML. * <code>lang</code> - adds a language attribute to specify what language to render the file in. * <code>start</code> - specifies a start time for audio and video files. * <code>end</code> - specifies an end time for audio and video files. * <code>thumbtime</code> - specifies the time to use to generate the thumbnail image for video files. To see the effect of each of these parameters, see the [[mw:Help:Images#Format|images help page on mediawiki.org]]. === Examples === With the file only: <syntaxhighlight lang="lua"> mFileLink.main{file = 'Example.png'} -- Renders as [[File:Example.png]] </syntaxhighlight> With format, size, link and caption options: <syntaxhighlight lang="lua"> mFileLink.main{ file = 'Example.png', format = 'thumb', size = '220px', link = 'Wikipedia:Sandbox', caption = 'An example.' } -- Renders as [[File:Example.png|thumb|220px|link=Wikipedia:Sandbox|An example.]] </syntaxhighlight> With format, size, and border: <syntaxhighlight lang="lua"> mFileLink.main{ file = 'Example.png', format = 'frameless', size = '220px', border = true } -- Renders as [[File:Example.png|frameless|border|220px]] </syntaxhighlight> <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly> 3ed97b9b6e53a4e041285a77da0c01f25e581d13 Module:Effective protection level 828 58 74 2023-10-07T16:50:42Z Silentg 2 Created page with "local p = {} -- Returns the permission required to perform a given action on a given title. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'autoreview' then local leve..." Scribunto text/plain local p = {} -- Returns the permission required to perform a given action on a given title. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'autoreview' then local level = mw.ext.FlaggedRevs.getStabilitySettings(title) level = level and level.autoreview if level == 'review' then return 'reviewer' elseif level ~= '' then return level else return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review end elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 ) end if title.namespace == 8 then -- MediaWiki namespace if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page return 'interfaceadmin' else -- any non-JS/CSS MediaWiki page return 'sysop' end elseif title.namespace == 2 and title.isSubpage then if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page return 'interfaceadmin' elseif title.contentModel == 'json' then -- user JSON page return 'sysop' end end if action == 'undelete' then return 'sysop' end local level = title.protectionLevels[action] and title.protectionLevels[action][1] if level == 'sysop' or level == 'editprotected' then return 'sysop' elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page return 'sysop' elseif level == 'templateeditor' then return 'templateeditor' elseif action == 'move' then local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move. if blacklistentry and not blacklistentry.params.autoconfirmed then return 'templateeditor' elseif title.namespace == 6 then return 'filemover' elseif level == 'extendedconfirmed' then return 'extendedconfirmed' else return 'autoconfirmed' end end local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename) if blacklistentry then if not blacklistentry.params.autoconfirmed then return 'templateeditor' elseif level == 'extendedconfirmed' then return 'extendedconfirmed' else return 'autoconfirmed' end elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason return 'autoconfirmed' elseif level then return level elseif action == 'upload' then return 'autoconfirmed' elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts return 'user' else return '*' end end setmetatable(p, { __index = function(t, k) return function(frame) return t._main(k, frame.args[1]) end end }) return p 70256a489edf6be9808031b14a7e3ef3e025da97 Module:Effective protection level/doc 828 59 75 2023-10-07T16:51:41Z Silentg 2 Created page with "{{Module rating|protected}} {{used in system}} This module provides a way to retrieve the group required to perform a given action on a page. It currently tests the following criteria: * The page being pending-changes protected: autoconfirmed * The page being a JavaScript or CSS subpage in userspace, or in the MediaWiki namespace: interfaceadmin * The page being in the MediaWiki namespace: sysop * The page being a JSON subpage in userspace: sysop * The page being protec..." wikitext text/x-wiki {{Module rating|protected}} {{used in system}} This module provides a way to retrieve the group required to perform a given action on a page. It currently tests the following criteria: * The page being pending-changes protected: autoconfirmed * The page being a JavaScript or CSS subpage in userspace, or in the MediaWiki namespace: interfaceadmin * The page being in the MediaWiki namespace: sysop * The page being a JSON subpage in userspace: sysop * The page being protected: sysop, templateeditor, extendedconfirmed, or autoconfirmed * The page being used in a cascading-protected page: sysop * The page's title matching the titleblacklist: templateeditor or autoconfirmed * A file being moved: filemover * A page being moved or a file being uploaded: autoconfirmed * A non-Draft non-talk page being created: user * Anything else: * Note that if a template-protected file is moved, both filemover and templateeditor are required, but this will return only templateeditor. This is not likely to be changed any time soon, since template protection currently shouldn't be used on files. == Usage == '''Warning:''' This module will use up to 4 expensive parser function calls each time it is ran. It should only be used if the exact effective protection level is necessary. Otherwise, consider using title.protectionLevels instead. === From other modules === To load this module: <syntaxhighlight lang="lua"> local effectiveProtectionLevel = require('Module:Effective protection level')._main </syntaxhighlight> The function accepts two parameters. The first is a string containing the action to check, which must be one of "edit", "create", "move", "upload", "undelete", or "autoreview". The second is optional, and can either be the name of the page to check, or a title returned from the mw.title functions. If the second parameter is omitted, the page being displayed is the one checked against. The return value is a string containing the name of the group required to perform the given action. === From wikitext === The parameters are the same as when it is called directly. {{tlinv|Effective protection level|''action''|''title''}} == See also == * [[Module:Effective protection expiry]] 19dafcf910d95f27ad7d21d097ffec985e26d3ec Module:Effective protection expiry 828 60 76 2023-10-07T16:52:31Z Silentg 2 Created page with "local p = {} -- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'auto..." Scribunto text/plain local p = {} -- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known. -- If no title is specified, the title of the page being displayed is used. function p._main(action, pagename) local title if type(pagename) == 'table' and pagename.prefixedText then title = pagename elseif pagename then title = mw.title.new(pagename) else title = mw.title.getCurrentTitle() end pagename = title.prefixedText if action == 'autoreview' then local stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title) return stabilitySettings and stabilitySettings.expiry or 'unknown' elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' then error( 'First parameter must be one of edit, move, create, upload, autoreview', 2 ) end local rawExpiry = mw.getCurrentFrame():callParserFunction('PROTECTIONEXPIRY', action, pagename) if rawExpiry == 'infinity' then return 'infinity' elseif rawExpiry == '' then return 'unknown' else local year, month, day, hour, minute, second = rawExpiry:match( '^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$' ) if year then return string.format( '%s-%s-%sT%s:%s:%s', year, month, day, hour, minute, second ) else error('internal error in Module:Effective protection expiry; malformed expiry timestamp') end end end setmetatable(p, { __index = function(t, k) return function(frame) return t._main(k, frame.args[1]) end end }) return p 9a8c58dc2667232ed08a9b206a5d89ca8150312b Module:Effective protection expiry/doc 828 61 77 2023-10-07T16:53:09Z Silentg 2 Created page with "{{Module rating |protected <!-- Values: pre-alpha • alpha • beta • release • protected -- If a rating not needed/relevant, delete this template call -->}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This module provides a way to retrieve the expiry of a restriction over a given action on a page. == Usage == This module will use up to 1 expensive parser function call each..." wikitext text/x-wiki {{Module rating |protected <!-- Values: pre-alpha • alpha • beta • release • protected -- If a rating not needed/relevant, delete this template call -->}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This module provides a way to retrieve the expiry of a restriction over a given action on a page. == Usage == This module will use up to 1 expensive parser function call each time it is ran. It will not use any if [[Module:Effective protection level]] was already called. === From other modules === To load this module: <syntaxhighlight lang="lua"> local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main </syntaxhighlight> The function accepts two parameters. The first is a string containing the action to check, which must be one of "edit", "create", "move", "upload", or "autoreview". The second is optional, and can either be the name of the page to check, or a title returned from the mw.title functions. If the second parameter is omitted, the page being displayed is the one checked against. The return value is either a date string in <code>YY-MM-DDThh:mm:ss</code> format, or one of the following strings: * <code>infinity</code> - for pages protected indefinitely, or pages which exist and are not protected * <code>unknown</code> - for pages where the expiry is unknown, or pages which do not exist and are not protected Note that if an existing page is not protected for the requested action, this will return 'infinity'. You need to check separately with [[Module:Effective protection level]]. === From wikitext === The parameters are the same as when it is called directly. {{tlinv|Effective protection expiry|''action''|''title''}} == See also == * [[Module:Effective protection level]] <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 923a62d4c7f740186b63c3eccaeac625b3a0bfaa Module:Submit an edit request 828 62 78 2023-10-07T16:54:58Z Silentg 2 Created page with "-- This module implements {{Submit an edit request}}. local CONFIG_MODULE = 'Module:Submit an edit request/config' -- Load necessary modules local mRedirect = require('Module:Redirect') local cfg = mw.loadData(CONFIG_MODULE) local effectiveProtectionLevel = require('Module:Effective protection level')._main local escape = require("Module:String")._escapePattern local lang = mw.language.getContentLanguage() local p = {} local validLevels = { semi = 'semi', extended..." Scribunto text/plain -- This module implements {{Submit an edit request}}. local CONFIG_MODULE = 'Module:Submit an edit request/config' -- Load necessary modules local mRedirect = require('Module:Redirect') local cfg = mw.loadData(CONFIG_MODULE) local effectiveProtectionLevel = require('Module:Effective protection level')._main local escape = require("Module:String")._escapePattern local lang = mw.language.getContentLanguage() local p = {} local validLevels = { semi = 'semi', extended = 'extended', template = 'template', full = 'full', interface = 'interface', manual = 'manual' } local function message(key, ...) local params = {...} local msg = cfg[key] if #params < 1 then return msg else return mw.message.newRawMessage(msg):params(params):plain() end end local function validateLevel(level) return level and validLevels[level] or 'full' end local function getLevelInfo(level, field) return cfg.protectionLevels[level][field] end local function resolveRedirect(page) return mRedirect.luaMain(page) end local function isProtected(page) local action = mw.title.new(page).exists and 'edit' or 'create' return effectiveProtectionLevel(action, page) ~= '*' end function p.makeRequestUrl(level, titleObj) titleObj = titleObj or mw.title.getCurrentTitle() local basePage = titleObj.basePageTitle.fullText if cfg['main-page-content'][basePage] then return tostring(mw.uri.fullUrl(message('main-page-request-page'))) end local talkPageName = titleObj.talkPageTitle if talkPageName == nil then return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page'))) end talkPageName = resolveRedirect(talkPageName.prefixedText) if isProtected(talkPageName) then return tostring(mw.uri.fullUrl(message('protected-talk-page-request-page'))) end level = validateLevel(level) if level == 'manual' then return tostring(mw.uri.fullUrl(talkPageName, { action = 'edit', section = 'new' })) end local sectionname = message( 'preload-title-text', getLevelInfo(level, 'levelText'), lang:formatDate(message('preload-title-date-format')) ) local content = mw.title.new(talkPageName):getContent() if content and content:find("== *" .. escape(sectionname) .. " *==") then local dedup = 2 while true do local newname = message("preload-title-dedup-suffix", sectionname, dedup) if not content:find("== *" .. escape(newname) .. " *==") then sectionname = newname break end dedup = dedup + 1 end end local url = mw.uri.fullUrl(talkPageName, { action = 'edit', editintro = getLevelInfo(level, 'editintro'), preload = message('preload-template'), preloadtitle = sectionname, section = 'new' }) url = tostring(url) -- Add the preload parameters. @TODO: merge this into the mw.uri.fullUrl -- query table once [[phab:T93059]] is fixed. local function encodeParam(key, val) return string.format('&%s=%s', mw.uri.encode(key), mw.uri.encode(val)) end url = url .. encodeParam('preloadparams[]', getLevelInfo(level, 'requestTemplate')) url = url .. encodeParam('preloadparams[]', titleObj.prefixedText) return url end function p._link(args) return string.format( '<span class="plainlinks">[%s %s]</span>', p.makeRequestUrl(args.type), args.display or message('default-display-value') ) end function p._button(args) return require('Module:Clickable button 2').luaMain{ [1] = args.display or message('default-display-value'), url = p.makeRequestUrl(args.type), class = 'mw-ui-progressive' } end local function makeInvokeFunc(func, wrapper) return function (frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = {wrapper} }) return func(args) end end p.link = makeInvokeFunc(p._link, message('link-wrapper-template')) p.button = makeInvokeFunc(p._button, message('button-wrapper-template')) return p 13fad0a3da4e4a2ebb0dd8029958487cc63f312a Module:Submit an edit request/doc 828 63 79 2023-10-07T16:57:26Z Silentg 2 Created page with "{{used in system}} {{Lua|Module:Redirect|Module:Effective protection level|Module:String|Module:Arguments|Module:Clickable button 2}} This module implements the {{tl|submit an edit request}} and {{tl|submit an edit request/link}} templates. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Submit an edit request}} and {{Template link|Submit an edit request/link}} templates. However, the module can also be used direc..." wikitext text/x-wiki {{used in system}} {{Lua|Module:Redirect|Module:Effective protection level|Module:String|Module:Arguments|Module:Clickable button 2}} This module implements the {{tl|submit an edit request}} and {{tl|submit an edit request/link}} templates. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Submit an edit request}} and {{Template link|Submit an edit request/link}} templates. However, the module can also be used directly from #invoke. For the edit request button, use <code><nowiki>{{#invoke:Submit an edit request|button|</nowiki>''args''<nowiki>}}</nowiki></code>, and for the edit request link only, use <code><nowiki>{{#invoke:Submit an edit request|link|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the respective template pages for a list of available parameters. == Usage from Lua modules == To use this module from other Lua modules, first load the module. <syntaxhighlight lang="lua"> local mEditRequest = require('Module:Submit an edit request') </syntaxhighlight> You can then use the _button function to generate an edit request button, and the _link function to generate an edit request link. <syntaxhighlight lang="lua"> mEditRequest._button(args) mEditRequest._link(args) </syntaxhighlight> The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the documentation of {{tl|Submit an edit request}} and {{tl|Submit an edit request/link}}. == Configuration == This module can be translated and configured for other wikis by editing [[Module:Submit an edit request/config]]. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly> 2531dba5e0bf66d46b387d0141e6fc6f73dd2cc3 Module:Redirect 828 64 80 2023-10-07T16:59:26Z Silentg 2 Created page with "-- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redi..." Scribunto text/plain -- This module provides functions for getting the target of a redirect page. local p = {} -- Gets a mw.title object, using pcall to avoid generating script errors if we -- are over the expensive function count limit (among other possible causes). local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end -- Gets the name of a page that a redirect leads to, or nil if it isn't a -- redirect. function p.getTargetFromText(text) local target = string.match( text, "^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]" ) or string.match( text, "^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]" ) return target and mw.uri.decode(target, 'PATH') end -- Gets the target of a redirect. If the page specified is not a redirect, -- returns nil. function p.getTarget(page, fulltext) -- Get the title object. Both page names and title objects are allowed -- as input. local titleObj if type(page) == 'string' or type(page) == 'number' then titleObj = getTitle(page) elseif type(page) == 'table' and type(page.getContent) == 'function' then titleObj = page else error(string.format( "bad argument #1 to 'getTarget'" .. " (string, number, or title object expected, got %s)", type(page) ), 2) end if not titleObj then return nil end local targetTitle = titleObj.redirectTarget if targetTitle then if fulltext then return targetTitle.fullText else return targetTitle.prefixedText end else return nil end end --[[ -- Given a single page name determines what page it redirects to and returns the -- target page name, or the passed page name when not a redirect. The passed -- page name can be given as plain text or as a page link. -- -- Returns page name as plain text, or when the bracket parameter is given, as a -- page link. Returns an error message when page does not exist or the redirect -- target cannot be determined for some reason. --]] function p.luaMain(rname, bracket, fulltext) if type(rname) ~= "string" or not rname:find("%S") then return nil end bracket = bracket and "[[%s]]" or "%s" rname = rname:match("%[%[(.+)%]%]") or rname local target = p.getTarget(rname, fulltext) local ret = target or rname ret = getTitle(ret) if ret then if fulltext then ret = ret.fullText else ret = ret.prefixedText end return bracket:format(ret) else return nil end end -- Provides access to the luaMain function from wikitext. function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) return p.luaMain(args[1], args.bracket, args.fulltext) or '' end -- Returns true if the specified page is a redirect, and false otherwise. function p.luaIsRedirect(page) local titleObj = getTitle(page) if not titleObj then return false end if titleObj.isRedirect then return true else return false end end -- Provides access to the luaIsRedirect function from wikitext, returning 'yes' -- if the specified page is a redirect, and the blank string otherwise. function p.isRedirect(frame) local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) if p.luaIsRedirect(args[1]) then return 'yes' else return '' end end return p a224c45940343d66f49a78b0a39b2045e2c45d20 Module:Redirect/doc 828 65 81 2023-10-07T16:59:57Z Silentg 2 Created page with "{{used in system}} {{Module rating|beta}} {{Module rating|protected}} {{Lua|Module:Arguments}} This module contains functions to find the target of a [[Help:Redirect|redirect]] page. == Main == The main function accepts the name of a single page. It determines if the page is a redirect; if so it looks up the page, extracts the target, and returns the target name as text. Its usage is <code><nowiki>{{#invoke:redirect|main|page-name}}</nowiki></code>. If <code>page-name..." wikitext text/x-wiki {{used in system}} {{Module rating|beta}} {{Module rating|protected}} {{Lua|Module:Arguments}} This module contains functions to find the target of a [[Help:Redirect|redirect]] page. == Main == The main function accepts the name of a single page. It determines if the page is a redirect; if so it looks up the page, extracts the target, and returns the target name as text. Its usage is <code><nowiki>{{#invoke:redirect|main|page-name}}</nowiki></code>. If <code>page-name</code> does not exist or is not a redirect then <code>page-name</code> is returned. If <code>page-name</code> is blank then blank is returned. The function normally neither takes nor gives square brackets, so to show the result as a link use <code><nowiki>[[{{#invoke:redirect|main|page-name}}]]</nowiki></code>. If the parameter ''bracket'' is given a nonblank value, brackets will be passed on if present. === Examples === * <code><nowiki>{{#invoke:redirect|main|WP:AFC}}</nowiki></code> &rarr; {{#invoke:redirect|main|WP:AFC}} * <code><nowiki>{{#invoke:redirect|main|[[WP:AFD]]|bracket=yes}}</nowiki></code> &rarr; {{#invoke:redirect|main|[[WP:AFD]]|bracket=yes}} * <code><nowiki>{{#invoke:redirect|main|Wikipedia:Articles for deletion}}</nowiki></code> &rarr; {{#invoke:redirect|main|Wikipedia:Articles for deletion}} * <code><nowiki>{{#invoke:redirect|main|Wikipedia:Articles for rumination}}</nowiki></code> &rarr; {{#invoke:redirect|main|Wikipedia:Articles for rumination}} Note: [[WP:AFC]] and [[WP:AFD]] are both redirects, but [[Wikipedia:Articles for deletion]] is not, and [[Wikipedia:Articles for rumination]] does not exist. === LuaMain === If you want to use the main function from another Lua module, you may want to use the luaMain function. This provides the same functionality as the main function, but doesn't require that a frame object be available. To use this, first load the module. <syntaxhighlight lang="lua"> local mRedirect = require('Module:Redirect') </syntaxhighlight> Then use the function with the following syntax: <syntaxhighlight lang="lua"> mRedirect.luaMain(rname, bracket) </syntaxhighlight> <var>rname</var> is the name of the redirect page, and if <var>bracket</var> is anything but false or nil, the module will produce a link rather than just a page name. == IsRedirect == The isRedirect function is used from wiki pages to find out if a given page is a redirect or not. If the page is a redirect, the function returns "yes", and if not the output is blank. Its usage is <code><nowiki>{{#invoke:redirect|isRedirect|page-name}}</nowiki></code>. === Examples === * <code><nowiki>{{#invoke:redirect|isRedirect|WP:AFC}}</nowiki></code> &rarr; {{#invoke:redirect|isRedirect|WP:AFC}} * <code><nowiki>{{#invoke:redirect|isRedirect|Wikipedia:Articles for deletion}}</nowiki></code> &rarr; {{#invoke:redirect|isRedirect|Wikipedia:Articles for deletion}} * <code><nowiki>{{#invoke:redirect|isRedirect|Wikipedia:Articles for rumination}}</nowiki></code> &rarr; {{#invoke:redirect|isRedirect|Wikipedia:Articles for rumination}} === LuaIsRedirect === The isRedirect can be accessed from other Lua modules in the same way as the main function: <syntaxhighlight lang="lua"> local mRedirect = require('Module:Redirect') mRedirect.luaIsRedirect(rname) </syntaxhighlight> == GetTarget == The getTarget function fetches the target page name of a redirect page, and is only usable from Lua. If the page specified is a redirect, then the target is returned; otherwise the function returns nil. To use it, first load the module. <syntaxhighlight lang="lua"> local mRedirect = require('Module:Redirect') </syntaxhighlight> Then use the function with the following syntax: <syntaxhighlight lang="lua"> mRedirect.getTarget(page) </syntaxhighlight> <var>page</var> can be either the name of the redirect page as a string, or a [[mw:Extension:Scribunto/Lua reference manual#Title objects|mw.title object]]. ==See also== * [[phab:T68974]] - Provide a standard way to get the target of a redirect page * [[mw:Extension:Scribunto/Lua reference manual#Title objects]], the Scribunto interface for determining a page's redirect status * [[Template:Get QID]], which uses this module * [[Template:Submit an edit request]], which uses this module 5f6a910dca958e44d69cb8b0d2d18a8efe6dd728 Module:String 828 66 82 2023-10-07T17:01:13Z Silentg 2 Created page with "--[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error c..." Scribunto text/plain --[[ This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. Global options ignore_errors: If set to 'true' or 1, any error condition will result in an empty string being returned rather than an error message. error_category: If an error occurs, specifies the name of a category to include with the error message. The default category is [Category:Errors reported by Module String]. no_category: If set to 'true' or 1, no category will be added if an error is generated. Unit tests for this module are available at Module:String/tests. ]] local str = {} --[[ len This function returns the length of the target string. Usage: {{#invoke:String|len|target_string|}} OR {{#invoke:String|len|s=target_string}} Parameters s: The string whose length to report If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the target string. ]] function str.len( frame ) local new_args = str._getParameters( frame.args, {'s'} ) local s = new_args['s'] or '' return mw.ustring.len( s ) end --[[ sub This function returns a substring of the target string at specified indices. Usage: {{#invoke:String|sub|target_string|start_index|end_index}} OR {{#invoke:String|sub|s=target_string|i=start_index|j=end_index}} Parameters s: The string to return a subset of i: The fist index of the substring to return, defaults to 1. j: The last index of the string to return, defaults to the last character. The first character of the string is assigned an index of 1. If either i or j is a negative value, it is interpreted the same as selecting a character by counting from the end of the string. Hence, a value of -1 is the same as selecting the last character of the string. If the requested indices are out of range for the given string, an error is reported. ]] function str.sub( frame ) local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } ) local s = new_args['s'] or '' local i = tonumber( new_args['i'] ) or 1 local j = tonumber( new_args['j'] ) or -1 local len = mw.ustring.len( s ) -- Convert negatives for range checking if i < 0 then i = len + i + 1 end if j < 0 then j = len + j + 1 end if i > len or j > len or i < 1 or j < 1 then return str._error( 'String subset index out of range' ) end if j < i then return str._error( 'String subset indices out of order' ) end return mw.ustring.sub( s, i, j ) end --[[ This function implements that features of {{str sub old}} and is kept in order to maintain these older templates. ]] function str.sublength( frame ) local i = tonumber( frame.args.i ) or 0 local len = tonumber( frame.args.len ) return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) ) end --[[ _match This function returns a substring from the source string that matches a specified pattern. It is exported for use in other modules Usage: strmatch = require("Module:String")._match sresult = strmatch( s, pattern, start, match, plain, nomatch ) Parameters s: The string to search pattern: The pattern or string to find within the string start: The index within the source string to start the search. The first character of the string has index 1. Defaults to 1. match: In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1. plain: A flag indicating that the pattern should be understood as plain text. Defaults to false. nomatch: If no match is found, output the "nomatch" value rather than an error. For information on constructing Lua patterns, a form of [regular expression], see: * http://www.lua.org/manual/5.1/manual.html#5.4.1 * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns ]] -- This sub-routine is exported for use in other modules function str._match( s, pattern, start, match_index, plain_flag, nomatch ) if s == '' then return str._error( 'Target string is empty' ) end if pattern == '' then return str._error( 'Pattern string is empty' ) end start = tonumber(start) or 1 if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then return str._error( 'Requested start is out of range' ) end if match_index == 0 then return str._error( 'Match index is out of range' ) end if plain_flag then pattern = str._escapePattern( pattern ) end local result if match_index == 1 then -- Find first match is simple case result = mw.ustring.match( s, pattern, start ) else if start > 1 then s = mw.ustring.sub( s, start ) end local iterator = mw.ustring.gmatch(s, pattern) if match_index > 0 then -- Forward search for w in iterator do match_index = match_index - 1 if match_index == 0 then result = w break end end else -- Reverse search local result_table = {} local count = 1 for w in iterator do result_table[count] = w count = count + 1 end result = result_table[ count + match_index ] end end if result == nil then if nomatch == nil then return str._error( 'Match not found' ) else return nomatch end else return result end end --[[ match This function returns a substring from the source string that matches a specified pattern. Usage: {{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}} OR {{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index |match=match_number|plain=plain_flag|nomatch=nomatch_output}} Parameters s: The string to search pattern: The pattern or string to find within the string start: The index within the source string to start the search. The first character of the string has index 1. Defaults to 1. match: In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1. plain: A flag indicating that the pattern should be understood as plain text. Defaults to false. nomatch: If no match is found, output the "nomatch" value rather than an error. If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from each string. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. If the match_number or start_index are out of range for the string being queried, then this function generates an error. An error is also generated if no match is found. If one adds the parameter ignore_errors=true, then the error will be suppressed and an empty string will be returned on any failure. For information on constructing Lua patterns, a form of [regular expression], see: * http://www.lua.org/manual/5.1/manual.html#5.4.1 * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns * http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns ]] -- This is the entry point for #invoke:String|match function str.match( frame ) local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} ) local s = new_args['s'] or '' local start = tonumber( new_args['start'] ) or 1 local plain_flag = str._getBoolean( new_args['plain'] or false ) local pattern = new_args['pattern'] or '' local match_index = math.floor( tonumber(new_args['match']) or 1 ) local nomatch = new_args['nomatch'] return str._match( s, pattern, start, match_index, plain_flag, nomatch ) end --[[ pos This function returns a single character from the target string at position pos. Usage: {{#invoke:String|pos|target_string|index_value}} OR {{#invoke:String|pos|target=target_string|pos=index_value}} Parameters target: The string to search pos: The index for the character to return If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the target string. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. The first character has an index value of 1. If one requests a negative value, this function will select a character by counting backwards from the end of the string. In other words pos = -1 is the same as asking for the last character. A requested value of zero, or a value greater than the length of the string returns an error. ]] function str.pos( frame ) local new_args = str._getParameters( frame.args, {'target', 'pos'} ) local target_str = new_args['target'] or '' local pos = tonumber( new_args['pos'] ) or 0 if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then return str._error( 'String index out of range' ) end return mw.ustring.sub( target_str, pos, pos ) end --[[ str_find This function duplicates the behavior of {{str_find}}, including all of its quirks. This is provided in order to support existing templates, but is NOT RECOMMENDED for new code and templates. New code is recommended to use the "find" function instead. Returns the first index in "source" that is a match to "target". Indexing is 1-based, and the function returns -1 if the "target" string is not present in "source". Important Note: If the "target" string is empty / missing, this function returns a value of "1", which is generally unexpected behavior, and must be accounted for separatetly. ]] function str.str_find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target'} ) local source_str = new_args['source'] or '' local target_str = new_args['target'] or '' if target_str == '' then return 1 end local start = mw.ustring.find( source_str, target_str, 1, true ) if start == nil then start = -1 end return start end --[[ find This function allows one to search for a target string or pattern within another string. Usage: {{#invoke:String|find|source_str|target_string|start_index|plain_flag}} OR {{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}} Parameters source: The string to search target: The string or pattern to find within source start: The index within the source string to start the search, defaults to 1 plain: Boolean flag indicating that target should be understood as plain text and not as a Lua style regular expression, defaults to true If invoked using named parameters, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. In some circumstances this is desirable, in other cases one may want to preserve the whitespace. This function returns the first index >= "start" where "target" can be found within "source". Indices are 1-based. If "target" is not found, then this function returns 0. If either "source" or "target" are missing / empty, this function also returns 0. This function should be safe for UTF-8 strings. ]] function str.find( frame ) local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } ) local source_str = new_args['source'] or '' local pattern = new_args['target'] or '' local start_pos = tonumber(new_args['start']) or 1 local plain = new_args['plain'] or true if source_str == '' or pattern == '' then return 0 end plain = str._getBoolean( plain ) local start = mw.ustring.find( source_str, pattern, start_pos, plain ) if start == nil then start = 0 end return start end --[[ replace This function allows one to replace a target string or pattern within another string. Usage: {{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}} OR {{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string| count=replacement_count|plain=plain_flag}} Parameters source: The string to search pattern: The string or pattern to find within source replace: The replacement text count: The number of occurences to replace, defaults to all. plain: Boolean flag indicating that pattern should be understood as plain text and not as a Lua style regular expression, defaults to true ]] function str.replace( frame ) local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } ) local source_str = new_args['source'] or '' local pattern = new_args['pattern'] or '' local replace = new_args['replace'] or '' local count = tonumber( new_args['count'] ) local plain = new_args['plain'] or true if source_str == '' or pattern == '' then return source_str end plain = str._getBoolean( plain ) if plain then pattern = str._escapePattern( pattern ) replace = mw.ustring.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences. end local result if count ~= nil then result = mw.ustring.gsub( source_str, pattern, replace, count ) else result = mw.ustring.gsub( source_str, pattern, replace ) end return result end --[[ simple function to pipe string.rep to templates. ]] function str.rep( frame ) local repetitions = tonumber( frame.args[2] ) if not repetitions then return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' ) end return string.rep( frame.args[1] or '', repetitions ) end --[[ escapePattern This function escapes special characters from a Lua string pattern. See [1] for details on how patterns work. [1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns Usage: {{#invoke:String|escapePattern|pattern_string}} Parameters pattern_string: The pattern string to escape. ]] function str.escapePattern( frame ) local pattern_str = frame.args[1] if not pattern_str then return str._error( 'No pattern string specified' ) end local result = str._escapePattern( pattern_str ) return result end --[[ count This function counts the number of occurrences of one string in another. ]] function str.count(frame) local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'}) local source = args.source or '' local pattern = args.pattern or '' local plain = str._getBoolean(args.plain or true) if plain then pattern = str._escapePattern(pattern) end local _, count = mw.ustring.gsub(source, pattern, '') return count end --[[ endswith This function determines whether a string ends with another string. ]] function str.endswith(frame) local args = str._getParameters(frame.args, {'source', 'pattern'}) local source = args.source or '' local pattern = args.pattern or '' if pattern == '' then -- All strings end with the empty string. return "yes" end if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then return "yes" else return "" end end --[[ join Join all non empty arguments together; the first argument is the separator. Usage: {{#invoke:String|join|sep|one|two|three}} ]] function str.join(frame) local args = {} local sep for _, v in ipairs( frame.args ) do if sep then if v ~= '' then table.insert(args, v) end else sep = v end end return table.concat( args, sep or '' ) end --[[ Helper function that populates the argument list given that user may need to use a mix of named and unnamed parameters. This is relevant because named parameters are not identical to unnamed parameters due to string trimming, and when dealing with strings we sometimes want to either preserve or remove that whitespace depending on the application. ]] function str._getParameters( frame_args, arg_list ) local new_args = {} local index = 1 local value for _, arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index] index = index + 1 end new_args[arg] = value end return new_args end --[[ Helper function to handle error messages. ]] function str._error( error_str ) local frame = mw.getCurrentFrame() local error_category = frame.args.error_category or 'Errors reported by Module String' local ignore_errors = frame.args.ignore_errors or false local no_category = frame.args.no_category or false if str._getBoolean(ignore_errors) then return '' end local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>' if error_category ~= '' and not str._getBoolean( no_category ) then error_str = '[[Category:' .. error_category .. ']]' .. error_str end return error_str end --[[ Helper Function to interpret boolean strings ]] function str._getBoolean( boolean_str ) local boolean_value if type( boolean_str ) == 'string' then boolean_str = boolean_str:lower() if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' or boolean_str == '' then boolean_value = false else boolean_value = true end elseif type( boolean_str ) == 'boolean' then boolean_value = boolean_str else error( 'No boolean value found' ) end return boolean_value end --[[ Helper function that escapes all pattern characters so that they will be treated as plain text. ]] function str._escapePattern( pattern_str ) return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ) end return str 6df794dd52434e0f6a372c9918f5a9dedd15f579 Module:String/doc 828 67 83 2023-10-07T17:01:58Z Silentg 2 Created page with "{{Used in system}} {{Module rating|protected}} {{Lmd|String}} This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. == Global..." wikitext text/x-wiki {{Used in system}} {{Module rating|protected}} {{Lmd|String}} This module is intended to provide access to basic string functions. Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture. If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace. == Global options == ; ignore_errors : If set to 'true' or 1, any error condition will result in an empty string being returned rather than an error message. ; error_category : If an error occurs, specifies the name of a category to include with the error message. The default category is {{clc|Errors reported by Module String}}. ; no_category : If set to 'true' or 1, no category will be added if an error is generated. Unit tests for this module are available at [[Module:String/testcases]]. == len == This function returns the length of the target string. Usage: : <code><nowiki>{{#invoke:</nowiki>String|len|''target_string''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|len|s= ''target_string'' }}</code> Parameters: ; s : The string whose length to report Examples: * <code><nowiki>{{#invoke:String|len| abcdefghi }}</nowiki></code> → {{#invoke:String|len| abcdefghi }} * <code><nowiki>{{#invoke:String|len|s= abcdefghi }}</nowiki></code> → {{#invoke:String|len|s= abcdefghi }} == sub == This function returns a substring of the target string at specified inclusive, one-indexed indices. Usage: : <code><nowiki>{{#invoke:</nowiki>String|sub|''target_string''|''start_index''|''end_index''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|sub|s= ''target_string'' |i= ''start_index'' |j= ''end_index'' }}</code> Parameters: ; s : The string to return a subset of ; i : The first index of the substring to return, defaults to 1. ; j : The last index of the string to return, defaults to the last character. The first character of the string is assigned an index of 1. If either i or j is a negative value, it is interpreted the same as selecting a character by counting from the end of the string. Hence, a value of -1 is the same as selecting the last character of the string. If the requested indices are out of range for the given string, an error is reported. To avoid error messages, use {{ml|ustring|sub}} instead. Examples: * <code><nowiki>"{{#invoke:String|sub| abcdefghi }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi }}" * <code><nowiki>"{{#invoke:String|sub|s= abcdefghi }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi }}" * <code><nowiki>"{{#invoke:String|sub| abcdefghi | 3 }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi | 3 }}" * <code><nowiki>"{{#invoke:String|sub|s= abcdefghi |i= 3 }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi |i= 3 }}" * <code><nowiki>"{{#invoke:String|sub| abcdefghi | 3 | 4 }}"</nowiki></code> → "{{#invoke:String|sub| abcdefghi | 3 | 4 }}" * <code><nowiki>"{{#invoke:String|sub|s= abcdefghi |i= 3 |j= 4 }}"</nowiki></code> → "{{#invoke:String|sub|s= abcdefghi |i= 3 |j= 4 }}" == sublength == This function implements the features of {{tl|str sub old}} and is kept in order to maintain these older templates. It returns a substring of the target string starting at a specified index and of a specified length. Usage: : <code><nowiki>{{#invoke:</nowiki>String|sublength|s= ''target_string'' |i= ''start_index'' |len= ''length'' }}</code> Parameters: ; s : The string ; i : The starting index of the substring to return. The first character of the string is assigned an index of 0. ; len : The length of the string to return, defaults to the last character. Examples: * <code><nowiki>{{#invoke:String|sublength|s= abcdefghi }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi }} * <code><nowiki>{{#invoke:String|sublength|s= abcdefghi |i= 3 }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi |i= 3 }} * <code><nowiki>{{#invoke:String|sublength|s= abcdefghi |i= 3 |len= 4 }}</nowiki></code> → {{#invoke:String|sublength|s= abcdefghi |i= 3 |len= 4 }} == match == This function returns a substring from the source string that matches a specified pattern. Usage: : <code><nowiki>{{#invoke:</nowiki>String|match|''source_string''|''pattern_string''|''start_index''|''match_number''|''plain_flag''|''nomatch_output''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|match|s= ''source_string'' |pattern= ''pattern_string'' |start= ''start_index'' |match= ''match_number'' |plain= ''plain_flag'' |nomatch= ''nomatch_output'' }}</code> Parameters: ; s : The string to search ; pattern : The pattern or string to find within the string ; start : The index within the source string to start the search. The first character of the string has index 1. Defaults to 1. ; match : In some cases it may be possible to make multiple matches on a single string. This specifies which match to return, where the first match is match= 1. If a negative number is specified then a match is returned counting from the last match. Hence match = -1 is the same as requesting the last match. Defaults to 1. ; plain : Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]). Defaults to false (to change: <code>plain=true</code>) ; nomatch : If no match is found, output the "nomatch" value rather than an error. ; ignore_errors : If no match is found and ignore_errors=true, output an empty string rather than an error. If the match_number or start_index are out of range for the string being queried, then this function generates an error. An error is also generated if no match is found. If one adds the parameter ignore_errors=true, then the error will be suppressed and an empty string will be returned on any failure. For information on constructing [[w:en:Lua (programming language)|Lua]] patterns, a form of [[w:en:regular expression|regular expression]], see: * [[mw:Special:MyLanguage/Extension:Scribunto/Lua_reference_manual#Patterns|Scribunto patterns]] * [[mw:Special:MyLanguage/Extension:Scribunto/Lua_reference_manual#Ustring_patterns|Scribunto Unicode string patterns]] Examples: * <code><nowiki>{{#invoke:String|match| abc123def456 |%d+}}</nowiki></code> → {{#invoke:String|match| abc123def456 |%d+}} * <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ }} * <code><nowiki>{{#invoke:String|match| abc123def456 |%d+|6}}</nowiki></code> → {{#invoke:String|match| abc123def456 |%d+|6}} * <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 }} * <code><nowiki>{{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 |match= 2 }}</nowiki></code> → {{#invoke:String|match|s= abc123def456 |pattern= %d+ |start= 6 |match= 2 }} * <code><nowiki>{{#invoke:String|match|s= abc123%d+ |pattern= %d+ }}</nowiki></code> → {{#invoke:String|match|s= abc123%d+ |pattern= %d+ }} * <code><nowiki>{{#invoke:String|match|s= abc123%d+ |pattern= %d+ |plain= true }}</nowiki></code> → {{#invoke:String|match|s= abc123%d+ |pattern= %d+ |plain= true }} * <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |no_category=true}} * <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d |nomatch= No numeric characters in string }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |nomatch= No numeric characters in string }} * <code><nowiki>{{#invoke:String|match|s= abc |pattern= %d |ignore_errors= true }}</nowiki></code> → {{#invoke:String|match|s= abc |pattern= %d |ignore_errors= true }} * <code><nowiki>{{#invoke:String|match|s= 0012001200 |pattern= 0*(%d*) }}</nowiki></code> → {{#invoke:String|match|s= 0012001200 |pattern= 0*(%d*) }} == pos == This function returns a single character from the target string at position pos. Usage: : <code><nowiki>{{#invoke:</nowiki>String|pos|''target_string''|''index_value''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|pos|target= ''target_string'' |pos= ''index_value'' }}</code> Parameters: ; target : The string to search ; pos : The index for the character to return The first character has an index value of 1. If one requests a negative value, this function will select a character by counting backwards from the end of the string. In other words pos = -1 is the same as asking for the last character. A requested value of zero, or a value greater than the length of the string returns an error. Examples: * <code><nowiki>{{#invoke:String|pos| abcdefghi | 4 }}</nowiki></code> → {{#invoke:String|pos| abcdefghi | 4 }} * <code><nowiki>{{#invoke:String|pos|target= abcdefghi |pos= 4 }}</nowiki></code> → {{#invoke:String|pos|target= abcdefghi |pos= 4 }} == str_find == This function duplicates the behavior of {{tl|str_find}}, including all of its quirks. This is provided in order to support existing templates, but is NOT RECOMMENDED for new code and templates. New code is recommended to use the "find" function instead. Returns the first index in "source" that is a match to "target". Indexing is 1-based, and the function returns -1 if the "target" string is not present in "source". Important Note: If the "target" string is empty / missing, this function returns a value of "1", which is generally unexpected behavior, and must be accounted for separately. Usage: : <code><nowiki>{{#invoke:</nowiki>String|str_find|''source_string''|''target_string''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|str_find|source= ''source_string'' |target= ''target_string'' }}</code> Parameters: ; source : The string to search ; target : The string to find within source Examples: * <code><nowiki>{{#invoke:String|str_find| abc123def }}</nowiki></code> → {{#invoke:String|str_find| abc123def }} * <code><nowiki>{{#invoke:String|str_find|source= abc123def }}</nowiki></code> → {{#invoke:String|str_find|source= abc123def }} * <code><nowiki>{{#invoke:String|str_find| abc123def |123}}</nowiki></code> → {{#invoke:String|str_find| abc123def |123}} * <code><nowiki>{{#invoke:String|str_find|source= abc123def |target= 123 }}</nowiki></code> → {{#invoke:String|str_find|source= abc123def |target= 123 }} * <code><nowiki>{{#invoke:String|str_find| abc123def |not}}</nowiki></code> → {{#invoke:String|str_find| abc123def |not}} == find == This function allows one to search for a target string or pattern within another string. Usage: : <code><nowiki>{{#invoke:</nowiki>String|find|''source_string''|''target_string''|''start_index''|''plain_flag''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|find|source= ''source_string'' |target= ''target_string'' |start= ''start_index'' |plain= ''plain_flag'' }}</code> Parameters: ; source : The string to search ; target : The string or pattern to find within source ; start : The index within the source string to start the search, defaults to 1 ; plain : Boolean flag indicating that target should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true This function returns the first index >= "start" where "target" can be found within "source". Indices are 1-based. If "target" is not found, then this function returns 0. If either "source" or "target" are missing / empty, this function also returns 0. This function should be safe for UTF-8 strings. Examples: * <code><nowiki>{{#invoke:String|find|abc123def|12}}</nowiki></code> → {{#invoke:String|find|abc123def|12}} * <code><nowiki>{{#invoke:String|find|source=abc123def|target=12}}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=12}} * <code><nowiki>{{#invoke:String|find|source=abc123def|target=pqr}}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=pqr}} * <code><nowiki>{{#invoke:String|find| abc123def |123}}</nowiki></code> → {{#invoke:String|find| abc123def |123}} * <code><nowiki>{{#invoke:String|find|source= abc123def |target= 123 }}</nowiki></code> → {{#invoke:String|find|source= abc123def |target= 123 }} * <code><nowiki>{{#invoke:String|find|source=abc123def|target=%d |start=3 |plain=false }}</nowiki></code> → {{#invoke:String|find|source=abc123def|target=%d |start=3 |plain=false }} When using unnamed parameters, preceding and trailing spaces are kept and counted: * <code><nowiki>{{#invoke:String|find| abc123def |c|false}}</nowiki></code> → {{#invoke:String|find| abc123def |c|false}} * <code><nowiki>{{#invoke:String|find|source= abc123def |target=c|plain=false}}</nowiki></code> → {{#invoke:String|find|source= abc123def |target=c|plain=false}} * <code><nowiki>{{#invoke:string|find|abc 123 def|%s|plain=false}}</nowiki></code> → {{#invoke:string|find|abc 123 def|%s|plain=false}} Testing for the presence of a string: * <code>{{pf|ifexpr|<nowiki>{{#invoke:string|find|haystack|needle}}</nowiki>|Found needle|Didn't find needle}}</code> → {{#ifexpr:{{#invoke:string|find|haystack|needle}}|Found needle|Didn't find needle}} {{anchor|replace}} == replace (gsub) == This function allows one to replace a target string or pattern within another string. To Lua programmers: this function works internally by calling <code>[[mw:Extension:Scribunto/Lua_reference_manual#mw.ustring.gsub|mw.ustring.gsub]]</code>. Usage: : <code><nowiki>{{#invoke:</nowiki>String|replace|''source_str''|''pattern_string''|''replace_string''|''replacement_count''|''plain_flag''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|replace|source= ''source_string'' |pattern= ''pattern_string'' |replace= ''replace_string'' |count= ''replacement_count'' |plain= ''plain_flag'' }}</code> Parameters: ; source : The string to search ; pattern : The string or pattern to find within source ; replace : The replacement text ; count : The number of occurrences to replace; defaults to all ; plain : Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true Examples: * <code><nowiki>"{{#invoke:String|replace| abc123def456 |123|XYZ}}"</nowiki></code> → "{{#invoke:String|replace| abc123def456 |123|XYZ}}" * <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= 123 |replace= XYZ }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= 123 |replace= XYZ }}" * <code><nowiki>"{{#invoke:String|replace| abc123def456 |%d+|XYZ|1|false}}"</nowiki></code> → "{{#invoke:String|replace| abc123def456 |%d+|XYZ|1|false}}" * <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |count=1 |plain= false }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |count=1 |plain= false }}" * <code><nowiki>"{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |plain= false }}"</nowiki></code> → "{{#invoke:String|replace|source= abc123def456 |pattern= %d+ |replace= XYZ |plain= false }}" * <code><nowiki>{{#invoke:String|replace|source= 0012001200 |pattern= ^0* |plain= false }}</nowiki></code> → {{#invoke:String|replace|source= 0012001200 |pattern= ^0* |plain= false }} == rep == Repeats a string ''n'' times. A simple function to pipe string.rep to templates. Usage: : <code><nowiki>{{#invoke:</nowiki>String|rep|''source''|''count''}}</code> Parameters: ; source : The string to repeat ; count : The number of repetitions. Examples: * <code><nowiki>"{{#invoke:String|rep|hello|3}}"</nowiki></code> → "{{#invoke:String|rep|hello|3}}" * <code><nowiki>"{{#invoke:String|rep| hello | 3 }}"</nowiki></code> → "{{#invoke:String|rep| hello | 3 }}" == escapePattern == In a [[:mw:LUAREF#Patterns|Lua pattern]], changes a ''class character'' into a ''literal character''. For example: in a pattern, character <code>.</code> catches "any character"; escapePattern will convert it to <code>%.</code>, catching just the literal character ".". Usage: * <code><nowiki>{{#invoke:String|escapePattern|</nowiki>''pattern_string''<nowiki>}}</nowiki></code> Parameters: ; pattern_string : The pattern string to escape Examples: * <code><nowiki>"{{#invoke:String|escapePattern|A.D.}}"</nowiki></code> → "{{#invoke:String|escapePattern|A.D.}}" * <code><nowiki>"{{#invoke:String|escapePattern|10%}}"</nowiki></code> → "{{#invoke:String|escapePattern|10%}}" == count == Counts the number of times a given pattern appears in the arguments that get passed on to this module. Counts disjoint matches only. Usage: : <code><nowiki>{{#invoke:</nowiki>String|count|''source_str''|''pattern_string''|''plain_flag''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|count|source= ''source_string'' |pattern= ''pattern_string''|plain= ''plain_flag'' }}</code> Parameters: ; source_string : The string to count occurrences in ; pattern : The string or pattern to count occurrences of within source ; plain : Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true Examples: * Count of 'a': <code><nowiki>"{{#invoke:String|count|aabbcc|a}}"</nowiki></code> → "{{#invoke:String|count|aabbcc|a}}" * Count occurrences of 'aba': <code><nowiki>"{{#invoke:String|count|ababababab|aba}}"</nowiki></code> → "{{#invoke:String|count|ababababab|aba}}" * Count of "either 'a' or 'c' ":<code><nowiki>"{{#invoke:String|count|aabbcc|[ac]|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aabbcc|[ac]|plain=false}}" * Count of "not 'a' ": <code><nowiki>"{{#invoke:String|count|aaabaaac|[^a]|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aaabaaac|[^a]|plain=false}}" * Count of "starts with 'a' ": <code><nowiki>"{{#invoke:String|count|aaabaaac|^a|plain=false}}"</nowiki></code> → "{{#invoke:String|count|aaabaaac|^a|plain=false}}" == join == Joins all strings passed as arguments into one string, treating the first argument as a separator Usage: : <code><nowiki>{{#invoke:</nowiki>String|join|''separator''|''string1''|''string2''|...}}</code> Parameters: ; separator : String that separates each string being joined together : Note that leading and trailing spaces are ''not'' stripped from the separator. ; string1/string2/... : Strings being joined together Examples: * <code><nowiki>"{{#invoke:String|join|x|foo|bar|baz}}"</nowiki></code> → "{{#invoke:String|join|x|foo|bar|baz}}" * <code><nowiki>"{{#invoke:String|join||a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join||a|b|c|d|e|f|g}}" * <code><nowiki>"{{#invoke:String|join|,|a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join|,|a|b|c|d|e|f|g}}" * <code><nowiki>"{{#invoke:String|join|, |a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join|, |a|b|c|d|e|f|g}}" * <code><nowiki>"{{#invoke:String|join| &ndash; |a|b|c|d|e|f|g}}"</nowiki></code> → "{{#invoke:String|join| &ndash; |a|b|c|d|e|f|g}}" The preceding example uses the html entity &amp;ndash; but the unicode character also works. == endswith == {{for|the startswith function|Module:String2#startswith}} Usage: : <code><nowiki>{{#invoke:</nowiki>String|endswith|''source_str''|''search_string''}}</code> OR : <code><nowiki>{{#invoke:</nowiki>String|endswith|source= ''source_string'' |pattern= ''search_string''}}</code> Returns "yes" if the source string ends with the search string. Use named parameters to have the strings trimmed before use. Despite the parameter name, ''search_string'' is not a Lua pattern, it is interpreted literally. * <code><nowiki>"{{#invoke:String|endswith|xxxyyy|y}}"</nowiki></code> → "{{#invoke:String|endswith|xxxyyy|y}}" * <code><nowiki>"{{#invoke:String|endswith|xxxyyy|z}}"</nowiki></code> → "{{#invoke:String|endswith|xxxyyy|z}}" == See also== {{String handling templates}} <includeonly>{{Sandbox other|| [[Category:Modules that add a tracking category]] [[Category:Modules that manipulate strings|*]] }}</includeonly> b69276b177d017dfb1f4f18e684ddce742d0a8b9 Module:Clickable button 2 828 68 84 2023-10-07T17:07:16Z Silentg 2 Created page with "-- This module implements {{clickable button 2}}. local yesno = require('Module:Yesno') local p = {} local function rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args) if yesno(args.category) == false then return '' end -- we have no tracking categories currently but args.category should be -- supported into the future, so just return a string here for now return '' end local function makeLinkData(args) local data = {} -- Get the link and display values, -- and fin..." Scribunto text/plain -- This module implements {{clickable button 2}}. local yesno = require('Module:Yesno') local p = {} local function rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args) if yesno(args.category) == false then return '' end -- we have no tracking categories currently but args.category should be -- supported into the future, so just return a string here for now return '' end local function makeLinkData(args) local data = {} -- Get the link and display values, -- and find whether we are outputting -- a wikilink or a URL. if args.url then data.isUrl = true data.link = args.url if args[1] then data.display = args[1] else if args[2] then data.display = args[2] else data.display = args.url p.urlisdisplay = true end end else data.isUrl = false p.urlisdisplay = false data.link = args[1] if args[2] then data.display = args[2] else data.display = args[1] end end if yesno(args.link) == false then p.nolink = true end -- Colours -- For the merge with {{clickable button}} local colour = args.color and args.color:lower() -- Classes local class = args.class and args.class:lower() data.classes = {} if class == 'ui-button-green' or class == 'ui-button-blue' or class == 'ui-button-red' then table.insert( data.classes, 'submit ui-button ui-widget ui-state-default ui-corner-all' .. ' ui-button-text-only ui-button-text' ) else table.insert(data.classes, 'mw-ui-button') end --If class is unset, --then let color determine class if not class then if colour == 'blue' then class = 'mw-ui-progressive' else if colour == 'red' then class = 'mw-ui-destructive' else if colour == 'green' then class = 'mw-ui-constructive' end end end end if class then table.insert(data.classes, class) end -- Styles do --[[ -- Check whether we are on the same page as we have specified in -- args[1], but not if we are using a URL link, as then args[1] is only -- a display value. If we are currently on the page specified in -- args[1] make the button colour darker so that it stands out from -- other buttons on the page. --]] local success, linkTitle, currentTitle if not data.isUrl then currentTitle = mw.title.getCurrentTitle() success, linkTitle = pcall(mw.title.new, args[1]) elseif p.urlisdisplay then currentTitle = mw.title.getCurrentTitle() end if success and linkTitle and mw.title.equals(currentTitle, linkTitle) and not p.urlisdisplay then if class == 'ui-button-blue' or class == 'mw-ui-progressive' or class == 'mw-ui-constructive' then data.backgroundColor = '#2962CB' data.color = '#fff' elseif class == 'ui-button-green' then data.backgroundColor = '#008B6D' elseif class == 'ui-button-red' or class == 'mw-ui-destructive' then data.backgroundColor = '#A6170F' else data.backgroundColor = '#CCC' data.color = '#666' end else if p.urlisdisplay then data.dummyLink = tostring(currentTitle) end end -- Add user-specified styles. data.style = args.style end return data end local function renderLink(data) -- Render the display span tag. local display do local displaySpan = mw.html.create('span') for i, class in ipairs(data.classes or {}) do displaySpan:addClass(class) end displaySpan :css{ ['background-color'] = data.backgroundColor, color = data.color } if data.style then displaySpan:cssText(data.style) end displaySpan:wikitext(data.display) display = tostring(displaySpan) end -- Render the link local link if p.nolink then if p.urlisdisplay then link = string.format('[[%s|%s]]', data.dummyLink, display) else link = string.format('%s', display) end else if data.isUrl then link = string.format('[%s %s]', data.link, display) else link = string.format('[[%s|%s]]', data.link, display) end end return string.format('<span class="plainlinks clickbutton">%s</span>', link) end function p.luaMain(args) -- If first arg or a url is not provided, -- but we have a second arg, make a button. -- Otherwise, return nothing. if not args[1] and not args.url then if args[2] then p.nolink = true else return '' end end local data = makeLinkData(args) local link = renderLink(data) local trackingCategories = rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args) return link .. trackingCategories end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Clickable button 2' }) return p.luaMain(args) end return p aecb758a361b684291d221c7de4da78d017660da Module:Clickable button 2/doc 828 69 85 2023-10-07T17:07:40Z Silentg 2 Created page with "{{Module rating|protected}} {{Used in system}} {{Lua|Module:Yesno|Module:Arguments}} This module implements the {{Template link|Clickable button 2}} template. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Clickable button 2}} template. However, it can also be used with the syntax <code><nowiki>{{#invoke:Clickable button 2|main|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the template page for a list o..." wikitext text/x-wiki {{Module rating|protected}} {{Used in system}} {{Lua|Module:Yesno|Module:Arguments}} This module implements the {{Template link|Clickable button 2}} template. == Usage from wikitext == To use this module from wikitext, you should normally use the {{Template link|Clickable button 2}} template. However, it can also be used with the syntax <code><nowiki>{{#invoke:Clickable button 2|main|</nowiki>''args''<nowiki>}}</nowiki></code>. Please see the template page for a list of available parameters. == Usage from Lua modules == To use this module from other Lua modules, first load the module. <syntaxhighlight lang="lua"> local mClickableButton2 = require('Module:Clickable button 2') </syntaxhighlight> You can then generate a button using the luaMain function. <syntaxhighlight lang="lua"> mClickableButton2.luaMain(args) </syntaxhighlight> The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the {{Template link|Clickable button 2}} template documentation. <includeonly>{{Sandbox other|| <!-- Categories go here and interwikis go in Wikidata. --> }}</includeonly> ff29bbfd2423b85cfc0d1d1a3db22fe44920b28a Module:Navbar 828 70 86 2023-10-08T04:54:06Z Silentg 2 Created page with "local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false..." Scribunto text/plain local p = {} local cfg = mw.loadData('Module:Navbar/configuration') local function get_title_arg(is_collapsible, template) local title_arg = 1 if is_collapsible then title_arg = 2 end if template then title_arg = 'template' end return title_arg end local function choose_links(template, args) -- The show table indicates the default displayed items. -- view, talk, edit, hist, move, watch -- TODO: Move to configuration. local show = {true, true, true, false, false, false} if template then show[2] = false show[3] = false local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} -- TODO: Consider removing TableTools dependency. for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do local num = index[v] if num then show[num] = true end end end local remove_edit_link = args.noedit if remove_edit_link then show[3] = false end return show end local function add_link(link_description, ul, is_mini, font_style) local l if link_description.url then l = {'[', '', ']'} else l = {'[[', '|', ']]'} end ul:tag('li') :addClass('nv-' .. link_description.full) :wikitext(l[1] .. link_description.link .. l[2]) :tag(is_mini and 'abbr' or 'span') :attr('title', link_description.html_title) :cssText(font_style) :wikitext(is_mini and link_description.mini or link_description.full) :done() :wikitext(l[3]) :done() end local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) if not title then error(cfg.invalid_title .. title_text) end local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' -- TODO: Get link_descriptions and show into the configuration module. -- link_descriptions should be easier... local link_descriptions = { { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', ['link'] = title:fullUrl('action=edit'), ['url'] = true }, { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', ['link'] = title:fullUrl('action=history'), ['url'] = true }, { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', ['link'] = title:fullUrl('action=watch'), ['url'] = true } } local ul = mw.html.create('ul') if has_brackets then ul:addClass(cfg.classes.brackets) :cssText(font_style) end for i, _ in ipairs(displayed_links) do if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end end return ul:done() end function p._navbar(args) -- TODO: We probably don't need both fontstyle and fontcolor... local font_style = args.fontstyle local font_color = args.fontcolor local is_collapsible = args.collapsible local is_mini = args.mini local is_plain = args.plain local collapsible_class = nil if is_collapsible then collapsible_class = cfg.classes.collapsible if not is_plain then is_mini = 1 end if font_color then font_style = (font_style or '') .. '; color: ' .. font_color .. ';' end end local navbar_style = args.style local div = mw.html.create():tag('div') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end local box_text = (args.text or cfg.box_text) .. ' ' -- the concatenated space guarantees the box text is separated if not (is_mini or is_plain) then div :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) end local template = args.template local displayed_links = choose_links(template, args) local has_brackets = args.brackets local title_arg = get_title_arg(is_collapsible, template) local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) div:node(list) if is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p 79f907e59eaa8bbf8dd50bb751933ebeaaa7eb17 Module:Navbar/doc 828 71 87 2023-10-08T04:54:57Z Silentg 2 Created page with "{{used in system}} {{module rating|protected}} {{Lua|Module:Navbar/configuration|Module:Arguments|Module:TableTools}} {{Uses TemplateStyles|Module:Navbar/styles.css|Template:Hlist/styles.css}} This is a [[WP:Lua|Lua]] implementation of {{tl|Navbar}}. It is used in [[Module:Navbox]]." wikitext text/x-wiki {{used in system}} {{module rating|protected}} {{Lua|Module:Navbar/configuration|Module:Arguments|Module:TableTools}} {{Uses TemplateStyles|Module:Navbar/styles.css|Template:Hlist/styles.css}} This is a [[WP:Lua|Lua]] implementation of {{tl|Navbar}}. It is used in [[Module:Navbox]]. 8525efb014e023829e4454a637299cf4a8cd958b Module:Navbar/configuration 828 72 88 2023-10-08T04:55:51Z Silentg 2 Created page with "return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Hlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal lis..." Scribunto text/plain return { ['templatestyles'] = 'Module:Navbar/styles.css', ['hlist_templatestyles'] = 'Hlist/styles.css', ['box_text'] = 'This box: ', -- default text box when not plain or mini ['title_namespace'] = 'Template', -- namespace to default to for title ['invalid_title'] = 'Invalid title ', ['classes'] = { -- set a line to nil if you don't want it ['navbar'] = 'navbar', ['plainlinks'] = 'plainlinks', -- plainlinks ['horizontal_list'] = 'hlist', -- horizontal list class ['mini'] = 'navbar-mini', -- class indicating small links in the navbar ['this_box'] = 'navbar-boxtext', ['brackets'] = 'navbar-brackets', -- 'collapsible' is the key for a class to indicate the navbar is -- setting up the collapsible element in addition to the normal -- navbar. ['collapsible'] = 'navbar-collapse', ['collapsible_title_mini'] = 'navbar-ct-mini', ['collapsible_title_full'] = 'navbar-ct-full' } } b007c336b17ec4bcd4d5a9dca9f8cba301662b55 Module:Navbar/configuration/doc 828 73 89 2023-10-08T04:56:11Z Silentg 2 Created page with "{{module rating|protected}} {{used in system}} Configuration used by [[Module:Navbar]]." wikitext text/x-wiki {{module rating|protected}} {{used in system}} Configuration used by [[Module:Navbar]]. 87cf99c13d46ff840ea95b1bcfe9816b9fb8b9b8 Module:Navbar/styles.css 828 74 90 2023-10-08T04:57:27Z Silentg 2 Created page with "/* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .nav..." sanitized-css text/css /* {{pp|small=yes}} */ .navbar { display: inline; font-size: 88%; font-weight: normal; } .navbar-collapse { float: left; text-align: left; } .navbar-boxtext { word-spacing: 0; } .navbar ul { display: inline-block; white-space: nowrap; line-height: inherit; } .navbar-brackets::before { margin-right: -0.125em; content: '[ '; } .navbar-brackets::after { margin-left: -0.125em; content: ' ]'; } .navbar li { word-spacing: -0.125em; } .navbar a > span, .navbar a > abbr { text-decoration: inherit; } .navbar-mini abbr { font-variant: small-caps; border-bottom: none; text-decoration: none; cursor: inherit; } .navbar-ct-full { font-size: 114%; margin: 0 7em; } .navbar-ct-mini { font-size: 114%; margin: 0 4em; } 9d4056f949b4f0b159e3d40dfb1a5f01e72f9571 Template:Hlist/styles.css 10 75 91 2023-10-08T04:58:22Z Silentg 2 Created page with "/* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or s..." sanitized-css text/css /* {{pp-protected|reason=match parent|small=yes}} */ /* * hlist styles are defined in core and Minerva and differ in Minerva. The * current definitions here (2023-01-01) are sufficient to override Minerva * without use of the hlist-separated class. The most problematic styles were * related to margin, padding, and the bullet. Check files listed at * [[MediaWiki talk:Common.css/to do#hlist-separated]] */ /* * TODO: When the majority of readership supports it (or some beautiful world * in which grade C support is above the minimum threshold), use :is() */ .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } /* Display list items inline */ .hlist dd, .hlist dt, .hlist li { /* * don't trust the note that says margin doesn't work with inline * removing margin: 0 makes dds have margins again * We also want to reset margin-right in Minerva */ margin: 0; display: inline; } /* Display requested top-level lists inline */ .hlist.inline, .hlist.inline dl, .hlist.inline ol, .hlist.inline ul, /* Display nested lists inline */ .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; } /* Hide empty list items */ .hlist .mw-empty-li { display: none; } /* TODO: :not() can maybe be used here to remove the later rule. naive test * seems to work. more testing needed. like so: *.hlist dt:not(:last-child)::after { * content: ": "; *} *.hlist dd:not(:last-child)::after, *.hlist li:not(:last-child)::after { * content: " · "; * font-weight: bold; *} */ /* Generate interpuncts */ .hlist dt::after { content: ": "; } .hlist dd::after, .hlist li::after { content: " · "; font-weight: bold; } .hlist dd:last-child::after, .hlist dt:last-child::after, .hlist li:last-child::after { content: none; } /* Add parentheses around nested lists */ .hlist dd dd:first-child::before, .hlist dd dt:first-child::before, .hlist dd li:first-child::before, .hlist dt dd:first-child::before, .hlist dt dt:first-child::before, .hlist dt li:first-child::before, .hlist li dd:first-child::before, .hlist li dt:first-child::before, .hlist li li:first-child::before { content: " ("; font-weight: normal; } .hlist dd dd:last-child::after, .hlist dd dt:last-child::after, .hlist dd li:last-child::after, .hlist dt dd:last-child::after, .hlist dt dt:last-child::after, .hlist dt li:last-child::after, .hlist li dd:last-child::after, .hlist li dt:last-child::after, .hlist li li:last-child::after { content: ")"; font-weight: normal; } /* Put ordinals in front of ordered list items */ .hlist ol { counter-reset: listitem; } .hlist ol > li { counter-increment: listitem; } .hlist ol > li::before { content: " " counter(listitem) "\a0"; } .hlist dd ol > li:first-child::before, .hlist dt ol > li:first-child::before, .hlist li ol > li:first-child::before { content: " (" counter(listitem) "\a0"; } 8c9dd9c9c00f30eead17fe10f51d183333e81f33 Module:Italic title 828 76 92 2023-10-08T05:00:18Z Silentg 2 Created page with "-- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ----------------..." Scribunto text/plain -- This module implements {{italic title}}. require('strict') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local yesno = require('Module:Yesno') -------------------------------------------------------------------------------- -- ItalicTitle class -------------------------------------------------------------------------------- local ItalicTitle = {} do ---------------------------------------------------------------------------- -- Class attributes and functions -- Things that belong to the class are here. Things that belong to each -- object are in the constructor. ---------------------------------------------------------------------------- -- Keys of title parts that can be italicized. local italicizableKeys = { namespace = true, title = true, dab = true, } ---------------------------------------------------------------------------- -- ItalicTitle constructor -- This contains all the dynamic attributes and methods. ---------------------------------------------------------------------------- function ItalicTitle.new() local obj = {} -- Function for checking self variable in methods. local checkSelf = libraryUtil.makeCheckSelfFunction( 'ItalicTitle', 'obj', obj, 'ItalicTitle object' ) -- Checks a key is present in a lookup table. -- Param: name - the function name. -- Param: argId - integer position of the key in the argument list. -- Param: key - the key. -- Param: lookupTable - the table to look the key up in. local function checkKey(name, argId, key, lookupTable) if not lookupTable[key] then error(string.format( "bad argument #%d to '%s' ('%s' is not a valid key)", argId, name, key ), 3) end end -- Set up object structure. local parsed = false local categories = {} local italicizedKeys = {} local italicizedSubstrings = {} -- Parses a title object into its namespace text, title, and -- disambiguation text. -- Param: options - a table of options with the following keys: -- title - the title object to parse -- ignoreDab - ignore any disambiguation parentheses -- Returns the current object. function obj:parseTitle(options) checkSelf(self, 'parseTitle') checkType('parseTitle', 1, options, 'table') checkTypeForNamedArg('parseTitle', 'title', options.title, 'table') local title = options.title -- Title and dab text local prefix, parentheses if not options.ignoreDab then prefix, parentheses = mw.ustring.match( title.text, '^(.+) %(([^%(%)]+)%)$' ) end if prefix and parentheses then self.title = prefix self.dab = parentheses else self.title = title.text end -- Namespace local namespace = mw.site.namespaces[title.namespace].name if namespace and #namespace >= 1 then self.namespace = namespace end -- Register the object as having parsed a title. parsed = true return self end -- Italicizes part of the title. -- Param: key - the key of the title part to be italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:italicize(key) checkSelf(self, 'italicize') checkType('italicize', 1, key, 'string') checkKey('italicize', 1, key, italicizableKeys) italicizedKeys[key] = true return self end -- Un-italicizes part of the title. -- Param: key - the key of the title part to be un-italicized. Possible -- keys are contained in the italicizableKeys table. -- Returns the current object. function obj:unitalicize(key) checkSelf(self, 'unitalicize') checkType('unitalicize', 1, key, 'string') checkKey('unitalicize', 1, key, italicizableKeys) italicizedKeys[key] = nil return self end -- Italicizes a substring in the title. This only affects the main part -- of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be italicized. -- Returns the current object. function obj:italicizeSubstring(s) checkSelf(self, 'italicizeSubstring') checkType('italicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = true return self end -- Un-italicizes a substring in the title. This only affects the main -- part of the title, not the namespace or the disambiguation text. -- Param: s - the substring to be un-italicized. -- Returns the current object. function obj:unitalicizeSubstring(s) checkSelf(self, 'unitalicizeSubstring') checkType('unitalicizeSubstring', 1, s, 'string') italicizedSubstrings[s] = nil return self end -- Renders the object into a page name. If no title has yet been parsed, -- the current title is used. -- Returns string function obj:renderTitle() checkSelf(self, 'renderTitle') -- Italicizes a string -- Param: s - the string to italicize -- Returns string. local function italicize(s) assert(type(s) == 'string', 's was not a string') assert(s ~= '', 's was the empty string') return string.format('<i>%s</i>', s) end -- Escape characters in a string that are magic in Lua patterns. -- Param: pattern - the pattern to escape -- Returns string. local function escapeMagicCharacters(s) assert(type(s) == 'string', 's was not a string') return s:gsub('%p', '%%%0') end -- If a title hasn't been parsed yet, parse the current title. if not parsed then self:parseTitle{title = mw.title.getCurrentTitle()} end -- Italicize the different parts of the title and store them in a -- titleParts table to be joined together later. local titleParts = {} -- Italicize the italicizable keys. for key in pairs(italicizableKeys) do if self[key] then if italicizedKeys[key] then titleParts[key] = italicize(self[key]) else titleParts[key] = self[key] end end end -- Italicize substrings. If there are any substrings to be -- italicized then start from the raw title, as this overrides any -- italicization of the main part of the title. if next(italicizedSubstrings) then titleParts.title = self.title for s in pairs(italicizedSubstrings) do local pattern = escapeMagicCharacters(s) local italicizedTitle, nReplacements = titleParts.title:gsub( pattern, italicize ) titleParts.title = italicizedTitle -- If we didn't make any replacements then it means that we -- have been passed a bad substring or that the page has -- been moved to a bad title, so add a tracking category. if nReplacements < 1 then categories['Pages using italic title with no matching string'] = true end end end -- Assemble the title together from the parts. local ret = '' if titleParts.namespace then ret = ret .. titleParts.namespace .. ':' end ret = ret .. titleParts.title if titleParts.dab then ret = ret .. ' (' .. titleParts.dab .. ')' end return ret end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments. -- Returns string function obj:renderDisplayTitle(...) checkSelf(self, 'renderDisplayTitle') return mw.getCurrentFrame():callParserFunction( 'DISPLAYTITLE', self:renderTitle(), ... ) end -- Returns an expanded DISPLAYTITLE parser function called with the -- result of obj:renderTitle, plus any other optional arguments, plus -- any tracking categories. -- Returns string function obj:render(...) checkSelf(self, 'render') local ret = self:renderDisplayTitle(...) for cat in pairs(categories) do ret = ret .. string.format( '[[Category:%s]]', cat ) end return ret end return obj end end -------------------------------------------------------------------------------- -- Exports -------------------------------------------------------------------------------- local p = {} local function getArgs(frame, wrapper) assert(type(wrapper) == 'string', 'wrapper was not a string') return require('Module:Arguments').getArgs(frame, { wrappers = wrapper }) end -- Main function for {{italic title}} function p._main(args) checkType('_main', 1, args, 'table') local italicTitle = ItalicTitle.new() italicTitle:parseTitle{ title = mw.title.getCurrentTitle(), ignoreDab = yesno(args.all, false) } if args.string then italicTitle:italicizeSubstring(args.string) else italicTitle:italicize('title') end return italicTitle:render(args[1]) end function p.main(frame) return p._main(getArgs(frame, 'Template:Italic title')) end function p._dabonly(args) return ItalicTitle.new() :italicize('dab') :render(args[1]) end function p.dabonly(frame) return p._dabonly(getArgs(frame, 'Template:Italic dab')) end return p 9b49016c8f526f680e9ecdaf36ec4ceafda2a2f8 Module:Italic title/doc 828 77 93 2023-10-08T05:00:45Z Silentg 2 Created page with "{{High-risk| approximately 844000 }} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module implements {{tl|italic title}} and {{tl|italic dab}}. Please see the template pages for documentation." wikitext text/x-wiki {{High-risk| approximately 844000 }} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} This module implements {{tl|italic title}} and {{tl|italic dab}}. Please see the template pages for documentation. 5dea766bbc5c3c2d91e2b8df9e54d506aef23b35 Template:Plainlist/styles.css 10 78 94 2023-10-08T05:01:23Z Silentg 2 Created page with "/* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; }" sanitized-css text/css /* {{pp-template|small=yes}} */ .plainlist ol, .plainlist ul { line-height: inherit; list-style: none; margin: 0; padding: 0; /* Reset Minerva default */ } .plainlist ol li, .plainlist ul li { margin-bottom: 0; } 51706efa229ff8794c0d94f260a208e7c5e6ec30 Template:Infobox/doc 10 79 95 2023-10-08T05:02:02Z Silentg 2 Created page with "{{Documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{distinguish|Template:Userbox}} {{#ifeq:{{SUBPAGENAME}}|sandbox||{{High-use}}}} {{Lua|Module:Infobox}} {{Parameter names example |name={{PAGENAME}} <!--|child |subbox |decat--> |title |above |subheader |subheader1 |subheader2={{{subheader2}}}<br/>...... |image|caption |image1|caption1 |image2|caption2={{{caption2..." wikitext text/x-wiki {{Documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{distinguish|Template:Userbox}} {{#ifeq:{{SUBPAGENAME}}|sandbox||{{High-use}}}} {{Lua|Module:Infobox}} {{Parameter names example |name={{PAGENAME}} <!--|child |subbox |decat--> |title |above |subheader |subheader1 |subheader2={{{subheader2}}}<br/>...... |image|caption |image1|caption1 |image2|caption2={{{caption2}}}<br/>...... |header1=<div style="border-top:1px dashed #ccc;">{{{header1}}}<br/>{{nobold|( ''or'' )}}</div> |label2={{{label1}}} |data2={{{data1}}} |data3=( ''or'' ) |data4=<div style="padding-bottom:0.25em;border-bottom:1px dashed #ccc;">{{{data1}}}</div> |header5={{{header2}}}<br/><div style="padding:0.75em 0 0.5em;">{{nobold|( ''or'' )}}</div> |label6={{{label2}}} |data6={{{data2}}} |data7=( ''or'' ) |data8=<div style="padding-bottom:0.25em;border-bottom:1px dashed #ccc;">{{{data2}}}</div> |data9=<div style="padding:0.75em 0 0.5em;">( ''etc'' )</div> |below }} This template is intended as a meta template: a template used for constructing other templates. '''Note''': In general, it is not meant for use directly in an article, but can be used on a one-off basis if required. [[Help:Infobox]] contains an introduction about the recommended content and design of infoboxes; [[Wikipedia:Manual of Style/Infoboxes]] contains additional style guidelines. See [[WP:List of infoboxes]] and [[:Category:Infobox templates]] for lists of prepared topic-specific infoboxes. == Usage == {{tlf|Infobox}} is a meta-template: used to organise an actual <nowiki>{{Infobox sometopic}}</nowiki> template (like {{tl|Infobox building}}). For <code><nowiki>[[Template:Infobox sometopic]]</nowiki></code>, template code then looks like this, simplified: <syntaxhighlight lang="wikitext"> {{Infobox | name = {{{name|{{PAGENAME}}}}} | image = {{{image|}}} | caption1 = {{{caption|}}} | label1 = Former names | data1 = {{{former_names|}}} | header2 = General information | label3 = Status | data3 = {{{status|}}} ... <!-- etc. --> }} </syntaxhighlight> == Optional control parameters == ; name : If this parameter is present, "view/talk/edit" links will be added to the bottom of the infobox pointing to the named page, prefixed by <code>Template:</code> if no namespace is specified. You may use the value <nowiki>{{subst:PAGENAME}}</nowiki>; however, this is rarely what you want because it will send users clicking these links in an infobox to the template code rather than the data in the infobox they probably want to change. ; child : See the [[#Embedding|Embedding]] section for details. If this is set to "yes", this child infobox should be titled but have no name parameter. This parameter is empty by default, set it to "yes" to activate it. ; subbox : See the [[#Subboxes|Subboxes]] section for details. If this is set to "yes", this subbox should be titled but have no name parameter. This parameter is empty by default, set to "yes" to activate it. It has no effect if the '''child''' parameter is also set to "yes". ; decat : If this is set to "yes", the current page will not be autocategorized in a maintenance category when the generated infobox has some problems or no visible data section. Leave empty by default or set to "yes" to activate it. ; autoheaders: If this is set to any non-blank value, headers which are not followed by data fields are suppressed. See the "[[#Hiding headers when all its data fields are empty|hiding headers when all its data fields are empty]]" section for more details. == Content parameters == === Title === There are two different ways to put a title on an infobox. One contains the title inside the infobox's border in the uppermost cell of the table, the other puts it as a caption on top of the table. You can use them both together, or just one or the other, or neither (though this is not recommended): ; title : Text to put in the caption over the top of the table (or as section header before the whole content of this table, if this is a child infobox). For [[Wikipedia:Manual of Style/Accessibility#Tables|accessibility reasons]], this is the most recommended alternative. ; above : Text to put within the uppermost cell of the table. ; subheader(n) : additional title fields which fit below {{{title}}} and {{{above}}}, but before images. Examples: {{Infobox | name = Infobox/doc | title = Text in caption over infobox | subheader = Subheader of the infobox | header = (the rest of the infobox goes here) }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | name = {{subst:PAGENAME}} | title = Text in caption over infobox | subheader = Subheader of the infobox | header = (the rest of the infobox goes here) }} </syntaxhighlight>{{clear}} {{Infobox | name = Infobox/doc | above = Text in uppermost cell of infobox | subheader = Subheader of the infobox | subheader2 = Second subheader of the infobox | header = (the rest of the infobox goes here) }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | name = {{subst:PAGENAME}} | above = Text in uppermost cell of infobox | subheader = Subheader of the infobox | subheader2 = Second subheader of the infobox | header = (the rest of the infobox goes here) }} </syntaxhighlight>{{clear}} === Illustration images === ; image(n) : images to display at the top of the template. Use full image syntax, for example <nowiki>[[File:example.png|200px|alt=Example alt text]]</nowiki>. Image is centered by default. See [[WP:ALT]] for more on alt text. ; caption(n) : Text to put underneath the images. === Main data === ; header(n) : Text to use as a header in row n. ; label(n) : Text to use as a label in row n. ; data(n) : Text to display as data in row n. Note: for any given value for (n), not all combinations of parameters are permitted. The presence of a {{para|header''(n)''}} will cause the corresponding {{para|data''(n)''}} (and {{para|rowclass''(n)''}} {{para|label''(n)''}}, see below) to be ignored; the absence of a {{para|data''(n)''}} will cause the corresponding {{para|label''(n)''}} to be ignored. Valid combinations for any single row are: * {{para|class''(n)''}} {{para|header''(n)''}} * {{para|rowclass''(n)''}} {{para|class''(n)''}} {{para|data''(n)''}} * {{para|rowclass''(n)''}} {{para|label''(n)''}} {{para|class''(n)''}} {{para|data''(n)''}} See the rendering of header4, label4, and data4 in the [[#Examples|Examples]] section below. ==== Number ranges ==== To allow flexibility when the layout of an infobox is changed, it may be helpful when developing an infobox to use non-contiguous numbers for header and label/data rows. Parameters for new rows can then be inserted in future without having to renumber existing parameters. For example: <syntaxhighlight lang="wikitext" style="overflow:auto"> | header3 = Section 1 | label5 = Label A | data5 = Data A | label7 = Label C | data7 = Data C | header10 = Section 2 | label12 = Label D | data12 = Data D </syntaxhighlight>{{clear}} It is also possible to automatically renumber parameter names by using [[User:Frietjes/infoboxgap.js]] or [[Module:IncrementParams]]. There is no upper limit on numbers but there must be at most 50 between each used number. ==== Making data fields optional ==== A row with a label but no data is not displayed. This allows for the easy creation of optional infobox content rows. To make a row optional use a parameter that defaults to an empty string, like so: <syntaxhighlight lang="wikitext" style="overflow:auto"> | label5 = Population | data5 = {{{population|}}} </syntaxhighlight>{{clear}} This way if an article doesn't define the population parameter in its infobox the row won't be displayed. For more complex fields with pre-formatted contents that would still be present even if the parameter wasn't set, you can wrap it all in an "#if" statement to make the whole thing vanish when the parameter is not used. For instance, the "#if" statement in the following example reads "#if:the parameter ''mass'' has been supplied |then display it, followed by 'kg'": <syntaxhighlight lang="wikitext" style="overflow:auto"> | label6 = Mass | data6 = {{ #if: {{{mass|}}} | {{{mass}}} kg }} </syntaxhighlight>{{clear}} For more on #if, see [[meta:ParserFunctions##if:|here]]. ==== Hiding headers when all its data fields are empty ==== You can also make headers automatically hide when their section is empty (has no data-row showing). Consider this situation: {{Infobox | title = Example: header with & without data | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = Header5 with data below | label6 = label6 text | data6 = Some value }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Example: header with & without data | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = Header5 with data below | label6 = label6 text | data6 = Some value }} </syntaxhighlight>{{clear}} If you want hide the header when no {{para|data''N''}} values are present, use '''{{para|autoheaders|y}}''': {{Infobox | title = Example: header with & without data | autoheaders = y | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = Header5 with data below | label6 = label6 text | data6 = Some value }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Example: header with & without data | autoheaders = y | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = Header5 with data below | label6 = label6 text | data6 = Some value }} </syntaxhighlight>{{clear}} So, header1 will be shown if any of item1, item2, or item3 is defined. If none of the three parameters are defined the header won't be shown and no empty row appears before the next visible content. Note: if the data has empty css elements, like {{para|data|2=&lt;span style="background:yellow;">&lt;/span>}}, this will be treated as non-empty (having data). If {{para|autoheaders|y}} but there are items that you ''do not'' want to trigger a header, place {{para|headerX|_BLANK_}}. This will serve as an empty header and separate it from the subsequent items. {{Infobox | title = Example: blank header with & without data | autoheaders = y | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = _BLANK_ | label6 = label6 text | data6 = Some value, but does not trigger header1 or show header5 }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Example: header with & without data | autoheaders = y | headerstyle = background:lightgrey | header1 = Header1 with empty section | label2 = label2 text | data2 = | label3 = label3 text | data3 = | label4 = label4 text | data4 = | header5 = _BLANK_ | label6 = label6 text | data6 = Some value, but does not trigger header1 or show header5 }} </syntaxhighlight>{{clear}} === Footer === ; below : Text to put in the bottom cell. The bottom cell is intended for footnotes, see-also, and other such information. == Presentation parameters == === Italic titles === Titles of articles with infoboxes may be made italic, in line with [[WP:ITALICTITLE]], by passing the <code>italic title</code> parameter. * Turn on italic titles by passing {{para|italic title|<nowiki>{{{italic title|}}}</nowiki>}} from the infobox. * Turn off by default (notably because only Latin script may be safely rendered in this style and italic may be needed to distinguish foreign language from local English language only in that script, but would be difficult to read for other scripts) but allow some instances to be made italic by passing {{para|italic title|<nowiki>{{{italic title|no}}}</nowiki>}} * Do not make any titles italic by not passing the parameter at all. === CSS styling === {{div col}} ; bodystyle : Applies to the infobox table as a whole ; titlestyle : Applies only to the title caption. Adding a background color is usually inadvisable since the text is rendered "outside" the infobox. ; abovestyle : Applies only to the "above" cell at the top. The default style has font-size:125%; since this cell is usually used for a title, if you want to use the above cell for regular-sized text include "font-size:100%;" in the abovestyle. ; imagestyle : Applies to the cell the image is in. This includes the text of the image caption, but you should set text properties with captionstyle instead of imagestyle in case the caption is moved out of this cell in the future. ; captionstyle : Applies to the text of the image caption. ; rowstyle(n) : This parameter is inserted into the <code>style</code> attribute for the specified row. ; headerstyle : Applies to all header cells ; subheaderstyle : Applies to all subheader cells ; labelstyle : Applies to all label cells ; datastyle : Applies to all data cells ; belowstyle : Applies only to the below cell {{div col end}} === HTML classes and microformats === {{div col}} ; bodyclass : This parameter is inserted into the <code>class</code> attribute for the infobox as a whole. ; titleclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''title''' caption. <!-- currently not implemented in Lua module ; aboverowclass : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''above''' cell is on. --> ; aboveclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''above''' cell. ; subheaderrowclass(n) : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''subheader''' is on. ; subheaderclass(n) : This parameter is inserted into the <code>class</code> attribute for the infobox's '''subheader'''. ; imagerowclass(n) : These parameters are inserted into the <code>class</code> attribute for the complete table row their respective '''image''' is on. ; imageclass : This parameter is inserted into the <code>class</code> attribute for the '''image'''. ; rowclass(n) : This parameter is inserted into the <code>class</code> attribute for the specified row including the '''label''' and '''data''' cells. ; class(n) : This parameter is inserted into the <code>class</code> attribute for the '''data''' cell of the specified row. If there's no '''data''' cell it has no effect. <!-- currently not implemented in Lua module ; belowrowclass : This parameter is inserted into the <code>class</code> attribute for the complete table row the '''below''' cell is on. --> ; belowclass : This parameter is inserted into the <code>class</code> attribute for the infobox's '''below''' cell. {{div col end}} This template supports the addition of microformat information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. Multiple class names may be specified, separated by spaces, some of them being used as selectors for custom styling according to a project policy or to the skin selected in user preferences, others being used for microformats. To flag an infobox as containing [[hCard]] information, for example, add the following parameter: <syntaxhighlight lang="wikitext" style="overflow:auto"> | bodyclass = vcard </syntaxhighlight>{{clear}} And for each row containing a data cell that's part of the vcard, add a corresponding class parameter: <syntaxhighlight lang="wikitext" style="overflow:auto"> | class1 = fn | class2 = org | class3 = tel </syntaxhighlight>{{clear}} ...and so forth. "above" and "title" can also be given classes, since these are usually used to display the name of the subject of the infobox. See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general. == Examples == Notice how the row doesn't appear in the displayed infobox when a '''label''' is defined without an accompanying '''data''' cell, and how all of them are displayed when a '''header''' is defined on the same row as a '''data''' cell. Also notice that '''subheaders''' are not bold by default like the '''headers''' used to split the main data section, because this role is meant to be for the '''above''' cell : {{Suppress categories| {{Infobox |name = Infobox/doc |bodystyle = |titlestyle = |abovestyle = background:#cfc; |subheaderstyle = |title = Test Infobox |above = Above text |subheader = Subheader above image |subheader2 = Second subheader |imagestyle = |captionstyle = |image = [[File:Example-serious.jpg|200px|alt=Example alt text]] |caption = Caption displayed below File:Example-serious.jpg |headerstyle = background:#ccf; |labelstyle = background:#ddf; |datastyle = |header1 = Header defined alone | label1 = | data1 = |header2 = | label2 = Label defined alone does not display (needs data, or is suppressed) | data2 = |header3 = | label3 = | data3 = Data defined alone |header4 = All three defined (header, label, data, all with same number) | label4 = does not display (same number as a header) | data4 = does not display (same number as a header) |header5 = | label5 = Label and data defined (label) | data5 = Label and data defined (data) |belowstyle = background:#ddf; |below = Below text }} }} <syntaxhighlight lang="wikitext"> {{Infobox |name = Infobox/doc |bodystyle = |titlestyle = |abovestyle = background:#cfc; |subheaderstyle = |title = Test Infobox |above = Above text |subheader = Subheader above image |subheader2 = Second subheader |imagestyle = |captionstyle = |image = [[File:Example-serious.jpg|200px|alt=Example alt text]] |caption = Caption displayed below File:Example-serious.jpg |headerstyle = background:#ccf; |labelstyle = background:#ddf; |datastyle = |header1 = Header defined alone | label1 = | data1 = |header2 = | label2 = Label defined alone does not display (needs data, or is suppressed) | data2 = |header3 = | label3 = | data3 = Data defined alone |header4 = All three defined (header, label, data, all with same number) | label4 = does not display (same number as a header) | data4 = does not display (same number as a header) |header5 = | label5 = Label and data defined (label) | data5 = Label and data defined (data) |belowstyle = background:#ddf; |below = Below text }} </syntaxhighlight> For this example, the {{para|bodystyle}} and {{para|labelstyle}} parameters are used to adjust the infobox width and define a default width for the column of labels: {{Infobox |name = Infobox/doc |bodystyle = width:20em |titlestyle = |title = Test Infobox |headerstyle = |labelstyle = width:33% |datastyle = |header1 = | label1 = Label 1 | data1 = Data 1 |header2 = | label2 = Label 2 | data2 = Data 2 |header3 = | label3 = Label 3 | data3 = Data 3 |header4 = Header 4 | label4 = | data4 = |header5 = | label5 = Label 5 | data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. |belowstyle = |below = Below text }} <syntaxhighlight lang="wikitext"> {{Infobox |name = Infobox/doc |bodystyle = width:20em |titlestyle = |title = Test Infobox |headerstyle = |labelstyle = width:33% |datastyle = |header1 = | label1 = Label 1 | data1 = Data 1 |header2 = | label2 = Label 2 | data2 = Data 2 |header3 = | label3 = Label 3 | data3 = Data 3 |header4 = Header 4 | label4 = | data4 = |header5 = | label5 = Label 5 | data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. |belowstyle = |below = Below text }} </syntaxhighlight> == Embedding == <!--Linked from [[Template:Subinfobox bodystyle/doc]]--> One infobox template can be embedded into another using the {{para|child}} parameter. This feature can be used to create a modular infobox, or to create better-defined logical sections. Long ago, it was necessary to use embedding in order to create infoboxes with more than 99 rows; but nowadays there's no limit to the number of rows that can be defined in a single instance of <code><nowiki>{{infobox}}</nowiki></code>. {{Infobox | title = Top level title | data1 = {{Infobox | decat = yes | child = yes | title = First subsection | label1= Label 1.1 | data1 = Data 1.1 }} | data2 = {{Infobox | decat = yes | child = yes |title = Second subsection | label1= Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Top level title | data1 = {{Infobox | decat = yes | child = yes | title = First subsection | label1= Label 1.1 | data1 = Data 1.1 }} | data2 = {{Infobox | decat = yes | child = yes |title = Second subsection | label1= Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} </syntaxhighlight>{{clear}} Note, in the examples above, the child infobox is placed in a <code>data</code> field, not a <code>header</code> field. Notice that the section subheadings are not in bold font if bolding is not explicitly specified. To obtain bold section headings, place the child infobox in a '''header''' field (but not in a '''label''' field because it would not be displayed!), either using {{Infobox | title = Top level title | header1 = {{Infobox | decat = yes | child = yes | title = First subsection | label1= Label 1.1 | data1 = Data 1.1 }} | header2 = {{Infobox | decat = yes | child = yes | title = Second subsection | label1= Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Top level title | header1 = {{Infobox | decat = yes | child = yes | title = First subsection | label1= Label 1.1 | data1 = Data 1.1 }} | header2 = {{Infobox | decat = yes | child = yes | title = Second subsection | label1= Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} </syntaxhighlight>{{clear}} or, {{Infobox | title = Top level title | header1 = First subsection {{Infobox | decat = yes | child = yes | label1 = Label 1.1 | data1 = Data 1.1 }} | header2 = Second subsection {{Infobox | decat = yes | child = yes | label1 = Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | title = Top level title | header1 = First subsection {{Infobox | decat = yes | child = yes | label1 = Label 1.1 | data1 = Data 1.1 }} | header2 = Second subsection {{Infobox | decat = yes | child = yes | label1 = Label 2.1 | data1 = Data 2.1 }} | belowstyle = | below = Below text }} </syntaxhighlight>{{clear}} Note that omitting the {{para|title}} parameter, and not including any text preceding the embedded infobox, may result in spurious blank table rows, creating gaps in the visual presentation. The garbage output can be suppressed using {{para|rowstyleN|display: none}}, replacing N with the data/header number. [[Wikipedia:WikiProject Infoboxes/embed]] includes some links to Wikipedia articles which include infoboxes embedded within other infoboxes. == Subboxes == An alternative method for embedding is to use {{para|subbox|yes}}, which removes the outer border from the infobox, but preserves the interior structure. One feature of this approach is that the parent and child boxes need not have the same structure, and the label and data fields are not aligned between the parent and child boxes because they are not in the same parent table. {{Infobox | headerstyle = background-color:#eee; | labelstyle = background-color:#eee; | header1 = Main 1 | header2 = Main 2 | data3 = {{Infobox | subbox = yes | headerstyle = background-color:#ccc; | labelstyle = background-color:#ddd; | header1 = Sub 3-1 | header2 = Sub 3-2 | label3 = Label 3-3 | data3 = Data 3-3 }} | data4 = {{Infobox | subbox = yes | labelstyle = background-color:#ccc; | label1 = Label 4-1 | data1 = Data 4-1 }} | label5 = Label 5 | data5 = Data 5 | header6 = Main 6 }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | headerstyle = background-color:#eee; | labelstyle = background-color:#eee; | header1 = Main 1 | header2 = Main 2 | data3 = {{Infobox | subbox = yes | headerstyle = background-color:#ccc; | labelstyle = background-color:#ddd; | header1 = Sub 3-1 | header2 = Sub 3-2 | label3 = Label 3-3 | data3 = Data 3-3 }} | data4 = {{Infobox | subbox = yes | labelstyle = background-color:#ccc; | label1 = Label 4-1 | data1 = Data 4-1 }} | label5 = Label 5 | data5 = Data 5 | header6 = Main 6 }} </syntaxhighlight>{{clear}} Similar embedding techniques may be used within content parameters of some other templates generating tables (such as [[:Template:Sidebar|Sidebar]]) : {{Sidebar | navbar = off | headingstyle = background-color:#eee; | heading1 = Heading 1 | heading2 = Heading 2 | content3 = {{Infobox | subbox = yes | headerstyle = background-color:#ccc; | labelstyle = background-color:#ddd; | header1 = Sub 3-1 | header2 = Sub 3-2 | label3 = Label 3-3 | data3 = Data 3-3 }} | content4 = {{Infobox | subbox = yes | labelstyle = background-color:#ccc; | label1 = Label 4-1 | data1 = Data 4-1 }} | heading5 = Heading 5 }} <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Sidebar | navbar = off | headingstyle = background-color:#eee; | heading1 = Heading 1 | heading2 = Heading 2 | content3 = {{Infobox | subbox = yes | headerstyle = background-color:#ccc; | labelstyle = background-color:#ddd; | header1 = Sub 3-1 | header2 = Sub 3-2 | label3 = Label 3-3 | data3 = Data 3-3 }} | content4 = {{Infobox | subbox = yes | labelstyle = background-color:#ccc; | label1 = Label 4-1 | data1 = Data 4-1 }} | heading5 = Heading 5 }} </syntaxhighlight>{{clear}} Note that the default padding of the parent data cell containing each subbox is still visible, so the subboxes are slightly narrower than the parent box and there's a higher vertical spacing between standard cells of the parent box than between cells of distinct subboxes. == Controlling line-breaking in embedded bulletless lists == Template {{tlx|nbsp}} may be used with {{tlx|wbr}} and {{tlx|nowrap}} to control line-breaking in bulletless lists embedded in infoboxes (e.g. cast list in {{tlx|Infobox film}}), to prevent wrapped long entries from being confused with multiple entries. See [[Template:Wbr/doc#Controlling line-breaking in infoboxes]] for details. == Full blank syntax == (Note: there is no limit to the number of possible rows; only 20 are given below since infoboxes larger than that will be relatively rare. Just extend the numbering as needed. The microformat "class" parameters are also omitted as they are not commonly used.) <syntaxhighlight lang="wikitext" style="overflow:auto"> {{Infobox | name = {{subst:PAGENAME}} | child = {{{child|}}} | subbox = {{{subbox|}}} | italic title = {{{italic title|no}}} | templatestyles = | child templatestyles = | grandchild templatestyles = | bodystyle = | titlestyle = | abovestyle = | subheaderstyle = | title = | above = | subheader = | imagestyle = | captionstyle = | image = | caption = | image2 = | caption2 = | headerstyle = | labelstyle = | datastyle = | header1 = | label1 = | data1 = | header2 = | label2 = | data2 = | header3 = | label3 = | data3 = | header4 = | label4 = | data4 = | header5 = | label5 = | data5 = | header6 = | label6 = | data6 = | header7 = | label7 = | data7 = | header8 = | label8 = | data8 = | header9 = | label9 = | data9 = | header10 = | label10 = | data10 = | header11 = | label11 = | data11 = | header12 = | label12 = | data12 = | header13 = | label13 = | data13 = | header14 = | label14 = | data14 = | header15 = | label15 = | data15 = | header16 = | label16 = | data16 = | header17 = | label17 = | data17 = | header18 = | label18 = | data18 = | header19 = | label19 = | data19 = | header20 = | label20 = | data20 = | belowstyle = | below = }} </syntaxhighlight>{{clear}} {{Help:Infobox/user style}} == Porting to other MediaWikis == The infobox template requires the [[:mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions. [[Wikipedia:WikiProject Transwiki|WikiProject Transwiki]] has a version of this template that has been modified to work on other MediaWikis. == TemplateData == {{TemplateData header}} <templatedata> { "description": "This template is intended as a meta template, a template used for constructing other templates. In general, it is not meant for use directly in an article but can be used on a one-off basis if required.", "format": "{{_\n| ________________ = _\n}}\n", "params": { "title": { "label": "Title", "description": "Title displayed above the infobox", "type": "string", "suggested": true }, "image": { "label": "Image", "description": "Image illustrating the topic. Use full image syntax.", "type": "content", "suggested": true, "example": "[[File:example.png|200px|alt=Example alt text]]" }, "caption": { "label": "Caption", "description": "caption for the image", "type": "content", "suggested": true } }, "paramOrder": [ "title", "image", "caption" ] } </templatedata> ==Tracking categories== * {{Category link with count|Articles with missing Wikidata information}} * {{Category link with count|Articles using infobox templates with no data rows}} * {{Category link with count|Pages using embedded infobox templates with the title parameter}} ==See also== * [[Module:Infobox]], the [[WP:LUA|Lua]] module on which this template is based * [[Module:Check for unknown parameters]] * {{tl|Infobox3cols}} * {{tl|Navbox}} and {{tl|Sidebar}} * [[Wikipedia:List of infoboxes|List of infoboxes]] * [[:Module:InfoboxImage]] <includeonly>{{Sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Infobox templates| ]] [[Category:Wikipedia metatemplates|Infobox]] [[Category:Templates generating microformats]] [[Category:Templates that add a tracking category]] [[Category:Templates based on the Infobox Lua module]] }}</includeonly> b7ba187ea76ee960bbe295ad01c44c646eaedadb User:Silentg/sandbox 2 80 96 2023-10-08T05:04:33Z Silentg 2 Created page with "{{Infobox | name = Hai | image = | caption1 = | label1 = Former names | data1 = {{{former_names|}}} | header2 = General information | label3 = Status | data3 = {{{status|}}} ... <!-- etc. --> }}" wikitext text/x-wiki {{Infobox | name = Hai | image = | caption1 = | label1 = Former names | data1 = {{{former_names|}}} | header2 = General information | label3 = Status | data3 = {{{status|}}} ... <!-- etc. --> }} aa5a09a27f3d952d9777030608a9681c814b1034 Template:Documentation subpage 10 81 97 2023-10-08T05:06:27Z Silentg 2 Created page with "<includeonly><!-- -->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}} | <!--(this template has been transcluded on a /doc or /{{{override}}} page)--> </includeonly><!-- -->{{#ifeq:{{{doc-notice|show}}} |show | {{Mbox | type = notice | style = margin-bottom:1.0em; | image = [[File:Edit-copy green.svg|40px|alt=|link=]] | text = {{strong|This is a [[Wikipedia:Template documentation|documentation]]..." wikitext text/x-wiki <includeonly><!-- -->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}} | <!--(this template has been transcluded on a /doc or /{{{override}}} page)--> </includeonly><!-- -->{{#ifeq:{{{doc-notice|show}}} |show | {{Mbox | type = notice | style = margin-bottom:1.0em; | image = [[File:Edit-copy green.svg|40px|alt=|link=]] | text = {{strong|This is a [[Wikipedia:Template documentation|documentation]] [[Wikipedia:Subpages|subpage]]}} for {{terminate sentence|{{{1|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}}}<br />It may contain usage information, [[Wikipedia:Categorization|categories]] and other content that is not part of the original {{#if:{{{text2|}}} |{{{text2}}} |{{#if:{{{text1|}}} |{{{text1}}} |{{#ifeq:{{SUBJECTSPACE}} |{{ns:User}} |{{lc:{{SUBJECTSPACE}}}} template page |{{#if:{{SUBJECTSPACE}} |{{lc:{{SUBJECTSPACE}}}} page|article}}}}}}}}. }} }}<!-- -->{{DEFAULTSORT:{{{defaultsort|{{PAGENAME}}}}}}}<!-- -->{{#if:{{{inhibit|}}} |<!--(don't categorize)--> | <includeonly><!-- -->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}} | [[Category:{{#switch:{{SUBJECTSPACE}} |Template=Template |Module=Module |User=User |#default=Wikipedia}} documentation pages]] | [[Category:Documentation subpages without corresponding pages]] }}<!-- --></includeonly> }}<!-- (completing initial #ifeq: at start of template:) --><includeonly> | <!--(this template has not been transcluded on a /doc or /{{{override}}} page)--> }}<!-- --></includeonly><noinclude>{{Documentation}}</noinclude> 41ca90af0945442788a2dbd08c8c54a61a23c057 Template:Mbox 10 82 98 2023-10-08T05:07:32Z Silentg 2 Created page with "{{#invoke:Message box|mbox}}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude>" wikitext text/x-wiki {{#invoke:Message box|mbox}}<noinclude> {{documentation}} <!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --> </noinclude> 5bfb2becf8bed35974b47e3ff8660dc14bee40c7 Template:Mbox/doc 10 83 99 2023-10-08T05:08:01Z Silentg 2 Created page with "{{Documentation subpage}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{Used in system}} {{Lua|Module:Message box}} {{Mbox templates (small)}} {{tl|Mbox}} stands for '''M'''ulti-namespace message'''box''', a [[WP:MTM|metatemplate]] with which [[Wikipedia:Namespace|namespace]]-sensitive {{cl|Mbox and messagebox templates|messagebox templates}} can be implemented. The most common are {{tl|Ambox}} for art..." wikitext text/x-wiki {{Documentation subpage}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{Used in system}} {{Lua|Module:Message box}} {{Mbox templates (small)}} {{tl|Mbox}} stands for '''M'''ulti-namespace message'''box''', a [[WP:MTM|metatemplate]] with which [[Wikipedia:Namespace|namespace]]-sensitive {{cl|Mbox and messagebox templates|messagebox templates}} can be implemented. The most common are {{tl|Ambox}} for articles, {{tl|Tmbox}} for talk pages, {{tl|Imbox}} for file (formerly image) pages, {{tl|Cmbox}} for category pages and {{tl|Ombox}} for other types of page. == Usage == This template should only be used for message boxes that really need to adapt their style. Most message boxes do not need this and should use one of the varieties just listed. Using those templates directly means that your template will look the same on its template page and at any other place you show it, which makes it clear on what kind of pages it is supposed to be used. It also gives you access to any extra features those templates offer, and it saves some server load. This template takes the same parameters as {{tl|Ambox}}, {{tl|Imbox}}, etc. Some of the boxes this template calls only handles images of max 52px width, thus that limitation also applies to this template or you will get ugly padding problems. === Parameters === List of all parameters: <syntaxhighlight lang="wikitext"> {{Mbox | name = name of the template | demospace = {{{demospace|}}} / main / talk / file / category / other | type = speedy / delete / content / style / notice / move / protection | image = none / [[File:Some image.svg|40px]] | imageright = [[File:Some image.svg|40px]] | style=CSS values | textstyle=CSS values | text = The message body text. | small = {{{small|left}}} / left / no | smallimage = none / [[File:Some image.svg|30px]] | smallimageright = none / [[File:Some image.svg|30px]] | smalltext = A shorter message body text. | plainlinks = no }} </syntaxhighlight> Note: The small parameters only have effect when the template appears on an article, talk or "other" page type. For their associated documentation, see {{tl|Ambox}}, {{tl|Tmbox}} and/or {{tl|Ombox}}. Using the small parameters when they are not valid has no effect, but also does no harm. == About demospace == This template optionally takes the "demospace" parameter as described at {{tl|Namespace detect}}. That parameter is only for testing and demonstration purposes. If you want to lock your message box to one style then instead use one of the other mboxes directly. Namespace "Image:" was renamed to "File:" on 11 December 2008. This template was updated to understand both names well before that, thus it still works fine. For backwards compatibility it still understands "demospace&nbsp;= image" which means the same thing as "demospace&nbsp;= file". But using "demospace&nbsp;= image" is now deprecated. == Mbox family == {{Mbox templates see also}} == See also == * [[:Category:Mbox and messagebox templates]] <includeonly>{{Sandbox other|| <!-- Add categories below this line, and interwikis at Wikidata --> [[Category:Mbox and messagebox templates]] }}</includeonly> dbbcbe289453e8a63cd193995d11c994c1afa27c Template:Documentation subpage/doc 10 84 100 2023-10-08T05:09:14Z Silentg 2 Created page with "{{tsh|doc sub}} {{Documentation subpage}} {{high-use}} {{Distinguish|Template:Documentation}} This template displays a message that the current page is a documentation subpage. == Usage == : {{Template link expanded|Documentation subpage}} : or : {{Template link expanded|Documentation subpage |&#91;&#91;{{var|Page where the documentation is [[Help:Transclusion|transcluded]]}}&#93;&#93;}} ===Userbox documentation=== To set this template to use "userbox" and "userbox pag..." wikitext text/x-wiki {{tsh|doc sub}} {{Documentation subpage}} {{high-use}} {{Distinguish|Template:Documentation}} This template displays a message that the current page is a documentation subpage. == Usage == : {{Template link expanded|Documentation subpage}} : or : {{Template link expanded|Documentation subpage |&#91;&#91;{{var|Page where the documentation is [[Help:Transclusion|transcluded]]}}&#93;&#93;}} ===Userbox documentation=== To set this template to use "userbox" and "userbox page" rather than "{{lc:{{ns:Template}}}}" and "{{lc:{{ns:Template}}}} page" or "{{lc:{{ns:User}}}} template" and "{{lc:{{ns:User}}}} template page", use: : {{Template link expanded|Userbox documentation subpage}} : or : {{Template link expanded|Userbox documentation subpage |&#91;&#91;{{var|userbox page}}&#93;&#93;}} ===Text customization=== The parameters {{para|text1}} and {{para|text2}} can be used to set the text of, respectively, the template's first and second lines. If ''text1'' is set but not ''text2'', both lines' text will derive from ''text1'': {{Hidden begin |showhide=left |title=With ''text1'' and ''text2''}} <code><nowiki>{{Documentation subpage |text1='''''text1 appears here''''' |text2='''''text2 appears here'''''}}</nowiki></code> {{Documentation subpage |[''page''] |text1='''''text1 appears here''''' |text2='''''text2 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}} {{Hidden end}} {{Hidden begin |showhide=left |title=With ''text2'' only}} <code><nowiki>{{Documentation subpage |text2='''''text2 appears here'''''}}</nowiki></code> {{Documentation subpage |[''page''] |text2='''''text2 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}} {{Hidden end}} {{Hidden begin |showhide=left |title=With ''text1'' only}} <code><nowiki>{{Documentation subpage |text1='''''text1 appears here'''''}}</nowiki></code> {{Documentation subpage |[''page''] |text1='''''text1 appears here''''' |override={{lc:{{SUBPAGENAME}}<!-- Hack to allow example to appear, even when viewed from [[Template:Documentation subpage]] -->}}}} {{Hidden end}} ===Other parameters=== {{para|inhibit|yes}} will prevent this template from generating any categories. (By default, "''Namespace'' documentation pages" (usually [[:Category:Template documentation pages]]) is added, or [[:Category:Documentation subpages without corresponding pages]] if the main page doesn't exist.) == Display == This template should normally be placed at the top of /doc pages. It changes output depending on where it is viewed: * On a /doc page, it displays a box explaining template documentation and links to the template page. * On other pages&nbsp;– i.e. pages transcluding the /doc page&nbsp;– the template will not show. The template page itself (which contains <code>{{Template link|Documentation}}</code>) will automatically note that the documentation is [[Help:Transclusion|transcluded]] from a subpage. == Module documentation == This template is automatically shown on /doc subpages in the [[Wikipedia:Namespace|module namespace]]. This is done automatically via [[MediaWiki:Scribunto-doc-page-header]]. == Automatic categorization == In addition to its message, the template adds pages to [[:Category:Template documentation pages]], [[:Category:User documentation pages]], or similar (named after the subject space), but only for documentation pages in namespaces with the subpage feature. It defaults the [[m:Help:Categories#Sort order|sort key]] to the page name without namespace: Template:Foo, for example, would be sorted as "Foo", i.e. under "F". == See also == <includeonly>{{#switch:{{FULLPAGENAME}} |Template:Userbox documentation subpage= *{{Template link|Userbox/categories}} *{{Template link|Userbox/citydoc}}}}</includeonly> *{{Template link|Documentation/see also}} *{{Template link|Documentation subpage}} *{{Template link|Userspace disclaimers}} *{{Template link|Userbox documentation subpage}} <includeonly>{{Sandbox other||<!-- Make sure only the template page is categorised. No subpages, and not after transclusion. This /doc page is reused, btw. -->{{#switch:{{FULLPAGENAME}} |Template:Documentation subpage = [[Category:Template documentation| ]] |Template:Userbox documentation subpage = [[Category:Template documentation| ]][[Category:Userboxes|Δ]] }} [[Category:Documentation header templates]] }}</includeonly> d1f2124df849a762883dcd9d41c601787fa54871 MediaWiki:Scribunto-doc-page-header 8 85 101 2023-10-08T05:12:15Z Silentg 2 Created page with "<div class="mw-parser-output">{{#if:{{#invoke:redirect|isRedirect|{{FULLPAGENAME}}}}||{{#ifeq:{{#titleparts:{{PAGENAME}}|1|2}}|documentation||{{documentation subpage}}}}}}</div>" wikitext text/x-wiki <div class="mw-parser-output">{{#if:{{#invoke:redirect|isRedirect|{{FULLPAGENAME}}}}||{{#ifeq:{{#titleparts:{{PAGENAME}}|1|2}}|documentation||{{documentation subpage}}}}}}</div> 91187e07e3e4b3cab7d0e1529a1be19884676a6d User:Silentg 2 4 102 8 2023-10-08T05:13:55Z Silentg 2 wikitext text/x-wiki Hello! [[User:Silentg/sandbox]] 748aec06148a5900f9665ff9f921f69518b4c33c Template:Distinguish 10 86 103 2023-10-08T05:15:46Z Silentg 2 Created page with "{{#invoke:Distinguish|distinguish}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. --> {{Documentation}} <!-- Add categories to the /doc subpage and interwikis to Wikidata, not here! --> </noinclude>" wikitext text/x-wiki {{#invoke:Distinguish|distinguish}}<noinclude><!-- splitting these lines causes {{Documentation}} template to terminate green shading when Distinguish is used in /doc pages. --> {{Documentation}} <!-- Add categories to the /doc subpage and interwikis to Wikidata, not here! --> </noinclude> f949a4cbfd6eb0ab77b832e69059a40a964b1fd8 Template:Distinguish/doc 10 87 104 2023-10-08T05:16:45Z Silentg 2 Created page with "{{Documentation subpage}} {{tsh|dist}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{High-use| 65005 }} {{Lua|Module:distinguish}} == Description == The "distinguish" template produces a [[WP:HAT|hatnote]] to point out to our readers the existence of one or more articles whose title(s) is, or are, similar to the page in question. It is used in cases where the distinction between the titles is generally o..." wikitext text/x-wiki {{Documentation subpage}} {{tsh|dist}} <!-- Please add categories at the bottom of this page, and interwikis at Wikidata (see Wikipedia:Wikidata) --> {{High-use| 65005 }} {{Lua|Module:distinguish}} == Description == The "distinguish" template produces a [[WP:HAT|hatnote]] to point out to our readers the existence of one or more articles whose title(s) is, or are, similar to the page in question. It is used in cases where the distinction between the titles is generally obvious and does not need further explanation. For those cases where an explanation is required, please use the templates {{tl|For}} and {{tl|About}}. For use on category pages, the corresponding template is {{Tl|Category distinguish}}. == Usage == Here is an example of its standard usage (used, for purposes of this example, with the placeholder article "Foo"; the following could be placed on a theoretical article named "Foo (song)", or perhaps one named "Fou" or "Fu"): {{tlx|distinguish|Foo}} → {{Distinguish|Foo}} This hatnote can be used to distinguish the topic from multiple other topics: {{tlx|distinguish|Foo|Bar}} → {{Distinguish|Foo|Bar}} {{tlx|distinguish|Foo|Bar|Baz}} → {{Distinguish|Foo|Bar|Baz}} The {{para|text}} parameter can be used to create customized text, in case context is required. An example is on the article [[Phobos (mythology)]], which contains a customized hatnote to distinguish it and "[[Phoebus]]" (a redirect of [[Apollo]]). Both links lead to topics about Greek gods, so the [[WP:NCDAB|parenthetical disambiguation]] in "Phobos (mythology)" is insufficient to disambiguate the two. Since it [[WP:HNR|is typically not preferable to link a redirect]] in a hatnote, the article "Apollo" is linked to directly and a short explanation fills in the necessary context: {{tlx|distinguish|text {{=}} Phoebus, an epithet of the Greek god &#91;&#91;Apollo]]}} → {{Distinguish|text = Phoebus, an epithet of the Greek god [[Apollo]] }} Note that a final period is automatically added at the end of the sentence, and that only one blue link is used per disambiguated topic (i.e, do not type <code><nowiki>...an [[epithet]] of the [[Greek]] god [[Apollo]].</nowiki></code> When the target is a disambiguation page, display of the parentheses may be avoided by escaping the vertical bar using the [[Help:Magic words|magic word]] {{Tl|!}}: {{Tick}}{{tlx|distinguish|Crossfire (disambiguation)&#123;&#123;&#33;&#125;&#125;Crossfire}} → {{Distinguish|Crossfire (disambiguation){{!}}Crossfire}} The escape is necessary, otherwise the template will read the next text as another topic: {{Cross}}{{tlx|distinguish|Crossfire (disambiguation)|Crossfire}} → {{Distinguish|Crossfire (disambiguation)|Crossfire}} == When to use == This hatnote is generally used when readers have misspelled their desired title, and the error would be apparent by simply displaying the alternative term without further explanation. For example, consider a reader looking for the punctuation mark who instead ends up at [[coma]]: : [[Coma]] : {{Distinguish|Comma}} Readers are presumed to recognize that they actually wanted ''comma'' by merely looking at the spelling, and this case generally requires no further explanation. However, {{tlx|distinguish}} is not suitable when the difference is not readily apparent without additional details. Consider a reader looking for a game they believe is named Reversi: : {{cross}} [[Reversi]] : {{Distinguish|Reversis}} In the above hatnote, it is not generally apparent how the suggested Reversis is different from Reversi, which is also a game. In this case you should use {{tlx|about}} instead of {{tlc|distinguish}}. The difference is to provide explanation upfront without requiring the reader to click through and differentiate the terms on their own. : {{tick}} [[Reversi]] :: ''This article is about the board game. For the card game, see [[Reversis]].'' {{tlc|Distinguish}} should only be used when the ambiguity exists for a portion of the readership that is sufficient to warrant a hatnote. Care should be taken to [[WP:TRHAT|avoid trivial uses]]. == TemplateData == {{TemplateData header}} <templatedata> { "params": { "1": { "label": "Name of article", "description": "Name of article that you want to link to", "type": "wiki-page-name", "suggested": true }, "2": { "label": "Optional additional article to link (2)", "description": "Optional additional article to link", "type": "wiki-page-name" }, "3": { "label": "Optional additional article to link (3)", "description": "Optional additional article to link", "type": "wiki-page-name" }, "4": { "label": "Optional additional article to link (4)", "description": "Optional additional article to link", "type": "wiki-page-name" }, "text": { "label": "Custom text", "description": "Custom message in wikitext; e.g. \"[[foo]] and [[Bar (computer science)|bar]]\" produces \"Not to be confused with [[foo]] and [[Bar (computer science)|bar]].\"", "type": "string" }, "selfref": { "label": "Self reference", "description": "If set, marks note as being a self reference, to not be shown when content is reused", "type": "boolean" } }, "description": "A hatnote used when there is an ambiguity in an article's title.", "paramOrder": [ "1", "2", "3", "4", "text", "selfref" ], "format": "inline" } </templatedata> == Redirects == * {{tl|Confused}} * {{tl|Confuse}} * {{tl|Misspelling}} * {{tl|Nottobeconfusedwith}} * {{tl|Ntbcw}} == See also == * {{tl|About}} * {{tl|Category distinguish}} * {{tl|For}} * {{tl|Redirect}} * {{tl|R from misspelling}} {{Hatnote templates}} <includeonly>{{sandbox other|| <!-- Add categories below this line, and interwikis at Wikidata --> [[Category:Disambiguation and redirection templates]] [[Category:Hatnote templates]] }}</includeonly> 86c325ae7de845d5db3beba07711e598cc2c1092 Module:Distinguish 828 88 105 2023-10-08T05:17:29Z Silentg 2 Created page with "local mHatnote = require('Module:Hatnote') local mHatlist = require('Module:Hatnote list') local mArguments --initialize lazily local mTableTools --initialize lazily local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.distinguish(frame) mArguments = require('Module:Arguments') mTableTools = require('Module:TableTools') local args = mArguments.getArgs(frame) local selfref = args.selfref local text = args.text a..." Scribunto text/plain local mHatnote = require('Module:Hatnote') local mHatlist = require('Module:Hatnote list') local mArguments --initialize lazily local mTableTools --initialize lazily local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} function p.distinguish(frame) mArguments = require('Module:Arguments') mTableTools = require('Module:TableTools') local args = mArguments.getArgs(frame) local selfref = args.selfref local text = args.text args = mTableTools.compressSparseArray(args) return p._distinguish(args, text, selfref) end function p._distinguish(args, text, selfref) checkType("_distinguish", 1, args, 'table') if #args == 0 and not text then return '' end local text = string.format( 'Not to be confused with %s.', text or mHatlist.orList(args, true) ) hnOptions = {selfref = selfref} return mHatnote._hatnote(text, hnOptions) end return p 0364d14af01fc656ad1d898c5036fbd12a7ca938 Module:Distinguish/doc 828 89 106 2023-10-08T05:18:01Z Silentg 2 Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Module rating|protected}} Implements {{tl|distinguish}}. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules]] }}</includeonly>" wikitext text/x-wiki <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Module rating|protected}} Implements {{tl|distinguish}}. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules]] }}</includeonly> 4e58b9411cafedca1f5352bf895ba0b4bbdd1487 Module:Hatnote 828 90 107 2023-10-08T05:19:44Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules...." Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the {{hatnote}} and {{format link}} meta-templates and includes -- -- helper functions for other Lua hatnote modules. -- -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local yesno -- lazily initialise [[Module:Yesno]] local formatLink -- lazily initialise [[Module:Format link]] ._formatLink local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end function p.defaultClasses(inline) -- Provides the default hatnote classes as a space-separated string; useful -- for hatnote-manipulation modules like [[Module:Hatnote group]]. return (inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' .. 'navigation-not-searchable' end function p.disambiguate(page, disambiguator) -- Formats a page title with a disambiguation parenthetical, -- i.e. "Example" → "Example (disambiguation)". checkType('disambiguate', 1, page, 'string') checkType('disambiguate', 2, disambiguator, 'string', true) disambiguator = disambiguator or 'disambiguation' return mw.ustring.format('%s (%s)', page, disambiguator) end function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to false. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end function p.makeWikitextError(msg, helpLink, addTrackingCategory, title) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- [[Module:Yesno]], and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') title = title or mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' ([[' .. helpLink .. '|help]])' else helpText = '' end -- Make the category text. local category if not title.isTalkPage -- Don't categorise talk pages and title.namespace ~= 2 -- Don't categorise userspace and yesno(addTrackingCategory) ~= false -- Allow opting out then category = 'Hatnote templates with errors' category = mw.ustring.format( '[[%s:%s]]', mw.site.namespaces[14].name, category ) else category = '' end return mw.ustring.format( '<strong class="error">Error: %s%s.</strong>%s', msg, helpText, category ) end local curNs = mw.title.getCurrentTitle().namespace p.missingTargetCat = --Default missing target category, exported for use in related modules ((curNs == 0) or (curNs == 14)) and 'Articles with hatnote templates targeting a nonexistent page' or nil function p.quote(title) --Wraps titles in quotation marks. If the title starts/ends with a quotation --mark, kerns that side as with {{-'}} local quotationMarks = { ["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true } local quoteLeft, quoteRight = -- Test if start/end are quotation marks quotationMarks[string.sub(title, 1, 1)], quotationMarks[string.sub(title, -1, -1)] if quoteLeft or quoteRight then title = mw.html.create("span"):wikitext(title) end if quoteLeft then title:css("padding-left", "0.15em") end if quoteRight then title:css("padding-right", "0.15em") end return '"' .. tostring(title) .. '"' end -------------------------------------------------------------------------------- -- Hatnote -- -- Produces standard hatnote text. Implements the {{hatnote}} template. -------------------------------------------------------------------------------- function p.hatnote(frame) local args = getArgs(frame) local s = args[1] if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end return p._hatnote(s, { extraclasses = args.extraclasses, selfref = args.selfref }) end function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) options = options or {} local inline = options.inline local hatnote = mw.html.create(inline == 1 and 'span' or 'div') local extraclasses if type(options.extraclasses) == 'string' then extraclasses = options.extraclasses end hatnote :attr('role', 'note') :addClass(p.defaultClasses(inline)) :addClass(extraclasses) :addClass(options.selfref and 'selfref' or nil) :wikitext(s) return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' } } .. tostring(hatnote) end return p 3ae1ed7094c5005ca0896395ec9a587287a0bef1 Module:Hatnote/doc 828 91 108 2023-10-08T05:20:13Z Silentg 2 Created page with "{{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} {{Uses TemplateStyles|Module:Hatnote/styles.css}} This is a meta-module that provides various functions for making [[Wikipedia:Hatnote|hatnotes]]. It implements the {{tl|hatnote}} template, for use in hatnotes at the top of pages. It also contains a number of helper functions for use in other Lua hatnote modules. == Use from wikitext == The function..." wikitext text/x-wiki {{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{module rating|protected}} {{Lua|Module:Yesno|Module:Arguments}} {{Uses TemplateStyles|Module:Hatnote/styles.css}} This is a meta-module that provides various functions for making [[Wikipedia:Hatnote|hatnotes]]. It implements the {{tl|hatnote}} template, for use in hatnotes at the top of pages. It also contains a number of helper functions for use in other Lua hatnote modules. == Use from wikitext == The functions in this module cannot be used directly from #invoke, and must be used through templates instead. Please see [[Template:Hatnote]] and [[Template:Format link]] for documentation. == Use from other Lua modules == To load this module from another Lua module, use the following code. <syntaxhighlight lang="lua"> local mHatnote = require('Module:Hatnote') </syntaxhighlight> You can then use the functions as documented below. === Hatnote === <syntaxhighlight lang="lua"> mHatnote._hatnote(s, options) </syntaxhighlight> Formats the string <var>s</var> as a hatnote. This encloses <var>s</var> in the tags {{tag|div|params=class="hatnote"}}. Options are provided in the <var>options</var> table. Options include: * <var>options.extraclasses</var> - a string of extra classes to provide * <var>options.selfref</var> - if this is not nil or false, adds the class "selfref", used to denote self-references to Wikipedia (see [[Template:Selfref]])) The CSS of the hatnote class is defined in [[Module:Hatnote/styles.css]]. ; Example 1 <syntaxhighlight lang="lua"> mHatnote._hatnote('This is a hatnote.') </syntaxhighlight> Produces: {{tag|div|content=This is a hatnote.|params=class="hatnote"}} Displays as: {{hatnote|This is a hatnote.}} ; Example 2 <syntaxhighlight lang="lua"> mHatnote._hatnote('This is a hatnote.', {extraclasses = 'boilerplate seealso', selfref = true}) </syntaxhighlight> Produces: {{tag|div|content=This is a hatnote.|params=class="hatnote boilerplate seealso selfref"}} Displayed as: {{hatnote|This is a hatnote.|extraclasses=boilerplate seealso|selfref=true}} === Find namespace id === <syntaxhighlight lang="lua"> mHatnote.findNamespaceId(link, removeColon) </syntaxhighlight> Finds the [[WP:NS|namespace id]] of the string <var>link</var>, which should be a valid page name, with or without the section name. This function will not work if the page name is enclosed with square brackets. When trying to parse the namespace name, colons are removed from the start of the link by default. This is helpful if users have specified colons when they are not strictly necessary. If you do not need to check for initial colons, set <var>removeColon</var> to false. ;Examples: : {{code|mHatnote.findNamespaceId('Lion')|lua}} &rarr; 0 : {{code|mHatnote.findNamespaceId('Category:Lions')|lua}} &rarr; 14 : {{code|mHatnote.findNamespaceId(':Category:Lions')|lua}} &rarr; 14 : {{code|mHatnote.findNamespaceId(':Category:Lions', false)|lua}} &rarr; 0 (the namespace is detected as ":Category", rather than "Category") === Make wikitext error === <syntaxhighlight lang="lua"> mHatnote.makeWikitextError(msg, helpLink, addTrackingCategory) </syntaxhighlight> Formats the string <var>msg</var> as a red wikitext error message, with optional link to a help page <var>helpLink</var>. Normally this function also adds {{clc|Hatnote templates with errors}}. To suppress categorization, pass <code>false</code> as third parameter of the function (<code>addTrackingCategory</code>). Examples: :{{code|mHatnote.makeWikitextError('an error has occurred')|lua}} &rarr; <strong class="error">Error: an error has occurred.</strong> :{{code|mHatnote.makeWikitextError('an error has occurred', 'Template:Example#Errors')|lua}} &rarr; <strong class="error">Error: an error has occurred ([[Template:Example#Errors|help]]).</strong> == Examples == For an example of how this module is used in other Lua modules, see [[Module:Labelled list hatnote]] <includeonly>{{Sandbox other|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Hatnote modules| ]] [[Category:Modules that add a tracking category]] }}</includeonly> d725b1aad3679d946ab3acb7975c0328b70aeac0 Module:Hatnote list 828 92 109 2023-10-08T05:21:25Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introd..." Scribunto text/plain -------------------------------------------------------------------------------- -- Module:Hatnote list -- -- -- -- This module produces and formats lists for use in hatnotes. In particular, -- -- it implements the for-see list, i.e. lists of "For X, see Y" statements, -- -- as used in {{about}}, {{redirect}}, and their variants. Also introduced -- -- are andList & orList helpers for formatting lists with those conjunctions. -- -------------------------------------------------------------------------------- local mArguments --initialize lazily local mFormatLink = require('Module:Format link') local mHatnote = require('Module:Hatnote') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local p = {} -------------------------------------------------------------------------------- -- List stringification helper functions -- -- These functions are used for stringifying lists, usually page lists inside -- the "Y" portion of "For X, see Y" for-see items. -------------------------------------------------------------------------------- --default options table used across the list stringification functions local stringifyListDefaultOptions = { conjunction = "and", separator = ",", altSeparator = ";", space = " ", formatted = false } --Searches display text only local function searchDisp(haystack, needle) return string.find( string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle ) end -- Stringifies a list generically; probably shouldn't be used directly local function stringifyList(list, options) -- Type-checks, defaults, and a shortcut checkType("stringifyList", 1, list, "table") if #list == 0 then return nil end checkType("stringifyList", 2, options, "table", true) options = options or {} for k, v in pairs(stringifyListDefaultOptions) do if options[k] == nil then options[k] = v end end local s = options.space -- Format the list if requested if options.formatted then list = mFormatLink.formatPages( {categorizeMissing = mHatnote.missingTargetCat}, list ) end -- Set the separator; if any item contains it, use the alternate separator local separator = options.separator for k, v in pairs(list) do if searchDisp(v, separator) then separator = options.altSeparator break end end -- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§" local conjunction = s .. options.conjunction .. s if #list == 2 and searchDisp(list[1], "§") or #list > 2 then conjunction = separator .. conjunction end -- Return the formatted string return mw.text.listToText(list, separator .. s, conjunction) end --DRY function function p.conjList (conj, list, fmt) return stringifyList(list, {conjunction = conj, formatted = fmt}) end -- Stringifies lists with "and" or "or" function p.andList (...) return p.conjList("and", ...) end function p.orList (...) return p.conjList("or", ...) end -------------------------------------------------------------------------------- -- For see -- -- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the -- {{about}} and {{redirect}} templates and their variants. -------------------------------------------------------------------------------- --default options table used across the forSee family of functions local forSeeDefaultOptions = { andKeyword = 'and', title = mw.title.getCurrentTitle().text, otherText = 'other uses', forSeeForm = 'For %s, see %s.', } --Collapses duplicate punctuation local function punctuationCollapse (text) local replacements = { ["%.%.$"] = ".", ["%?%.$"] = "?", ["%!%.$"] = "!", ["%.%]%]%.$"] = ".]]", ["%?%]%]%.$"] = "?]]", ["%!%]%]%.$"] = "!]]" } for k, v in pairs(replacements) do text = string.gsub(text, k, v) end return text end -- Structures arguments into a table for stringification, & options function p.forSeeArgsToTable (args, from, options) -- Type-checks and defaults checkType("forSeeArgsToTable", 1, args, 'table') checkType("forSeeArgsToTable", 2, from, 'number', true) from = from or 1 checkType("forSeeArgsToTable", 3, options, 'table', true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- maxArg's gotten manually because getArgs() and table.maxn aren't friends local maxArg = 0 for k, v in pairs(args) do if type(k) == 'number' and k > maxArg then maxArg = k end end -- Structure the data out from the parameter list: -- * forTable is the wrapper table, with forRow rows -- * Rows are tables of a "use" string & a "pages" table of pagename strings -- * Blanks are left empty for defaulting elsewhere, but can terminate list local forTable = {} local i = from local terminated = false -- If there is extra text, and no arguments are given, give nil value -- to not produce default of "For other uses, see foo (disambiguation)" if options.extratext and i > maxArg then return nil end -- Loop to generate rows repeat -- New empty row local forRow = {} -- On blank use, assume list's ended & break at end of this loop forRow.use = args[i] if not args[i] then terminated = true end -- New empty list of pages forRow.pages = {} -- Insert first pages item if present table.insert(forRow.pages, args[i + 1]) -- If the param after next is "and", do inner loop to collect params -- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3} while args[i + 2] == options.andKeyword do if args[i + 3] then table.insert(forRow.pages, args[i + 3]) end -- Increment to next "and" i = i + 2 end -- Increment to next use i = i + 2 -- Append the row table.insert(forTable, forRow) until terminated or i > maxArg return forTable end -- Stringifies a table as formatted by forSeeArgsToTable function p.forSeeTableToString (forSeeTable, options) -- Type-checks and defaults checkType("forSeeTableToString", 1, forSeeTable, "table", true) checkType("forSeeTableToString", 2, options, "table", true) options = options or {} for k, v in pairs(forSeeDefaultOptions) do if options[k] == nil then options[k] = v end end -- Stringify each for-see item into a list local strList = {} if forSeeTable then for k, v in pairs(forSeeTable) do local useStr = v.use or options.otherText local pagesStr = p.andList(v.pages, true) or mFormatLink._formatLink{ categorizeMissing = mHatnote.missingTargetCat, link = mHatnote.disambiguate(options.title) } local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr) forSeeStr = punctuationCollapse(forSeeStr) table.insert(strList, forSeeStr) end end if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end -- Return the concatenated list return table.concat(strList, ' ') end -- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps -- but not blank/whitespace values. Ignores named args and args < "from". function p._forSee (args, from, options) local forSeeTable = p.forSeeArgsToTable(args, from, options) return p.forSeeTableToString(forSeeTable, options) end -- As _forSee, but uses the frame. function p.forSee (frame, from, options) mArguments = require('Module:Arguments') return p._forSee(mArguments.getArgs(frame), from, options) end return p d0828422b1aa0d0d0092d699d059c9e882260398 Module:Hatnote list/doc 828 93 110 2023-10-08T05:21:49Z Silentg 2 Created page with "<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{used in system|in [[MediaWiki:Wantedpages-summary]]}} == Usage from wikitext == This module is not designed be used directly from wikitext even though <code>forSee</code> does take an initial <code>frame</code> argument and could potentially be used from wikitext, e.g.: *<code><nowiki>{{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|Fo..." wikitext text/x-wiki <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{used in system|in [[MediaWiki:Wantedpages-summary]]}} == Usage from wikitext == This module is not designed be used directly from wikitext even though <code>forSee</code> does take an initial <code>frame</code> argument and could potentially be used from wikitext, e.g.: *<code><nowiki>{{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|For}}|Module:For|{{tl|About}}|Module:About}} POSTFIX}}</nowiki></code> → {{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|For}}|Module:For|{{tl|About}}|Module:About}} POSTFIX}} == Usage from Lua == To call the module, use <syntaxhighlight lang="lua">local mHatList = require('Module:Hatnote list')</syntaxhighlight> or similar, then access its methods through the <code>mHatList</code> variable (or whatever was used). ===andList=== <code>andList</code> takes a list in table form, and returns a string with the list separated with "and" and commas as appropriate. ===orList=== <code>orList</code> takes a list in table form, and returns a string with the list separated with "or" and commas as appropriate. ===forSee=== <code>_forSee</code> takes three arguments: a table of trimmed arguments with blanks removed, a "from" number with the index to start at, and an options table, and returns a string with a number of "<code><nowiki>For X, see [[Y]]</nowiki></code>" sentences. The links are formatted using the methods from [[Module:Hatnote]]. As a convenience, the <code>forSee</code> method (without the leading underscore) takes the same arguments except with a frame instead of an args table, using <code>getArgs()</code> from [[Module:Arguments]] to preprocess the arguments. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules| ]] }}</includeonly> 185773df40049bb4687884580b408617c8ecc548 Module:Hatnote/styles.css 828 94 111 2023-10-08T05:22:56Z Silentg 2 Created page with "/* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; }" sanitized-css text/css /* {{pp|small=y}} */ .hatnote { font-style: italic; } /* Limit structure CSS to divs because of [[Module:Hatnote inline]] */ div.hatnote { /* @noflip */ padding-left: 1.6em; margin-bottom: 0.5em; } .hatnote i { font-style: normal; } /* The templatestyles element inserts a link element before hatnotes. * TODO: Remove link if/when WMF resolves T200206 */ .hatnote + link + .hatnote { margin-top: -0.5em; } 44680ffd6e888866df2cdfa0341af9c7b97da94c Module:Format link 828 95 112 2023-10-08T05:24:04Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the {{format link}} template. -------------------------------------------------------------------------------- local libraryUtil = require(..." Scribunto text/plain -------------------------------------------------------------------------------- -- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the {{format link}} template. -------------------------------------------------------------------------------- local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg local mArguments -- lazily initialise [[Module:Arguments]] local mError -- lazily initialise [[Module:Error]] local yesno -- lazily initialise [[Module:Yesno]] local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end local function maybeItalicize(s, shouldItalicize) -- Italicize s if s is a string and the shouldItalicize parameter is true. if s and shouldItalicize then return '<i>' .. s .. '</i>' else return s end end local function parseLink(link) -- Parse a link and return a table with the link's components. -- These components are: -- - link: the link, stripped of any initial colon (always present) -- - page: the page name (always present) -- - section: the page name (may be nil) -- - display: the display text, if manually entered after a pipe (may be nil) link = removeInitialColon(link) -- Find whether a faux display value has been added with the {{!}} magic -- word. local prePipe, display = link:match('^(.-)|(.*)$') link = prePipe or link -- Find the page, if it exists. -- For links like [[#Bar]], the page will be nil. local preHash, postHash = link:match('^(.-)#(.*)$') local page if not preHash then -- We have a link like [[Foo]]. page = link elseif preHash ~= '' then -- We have a link like [[Foo#Bar]]. page = preHash end -- Find the section, if it exists. local section if postHash and postHash ~= '' then section = postHash end return { link = link, page = page, section = section, display = display, } end local function formatDisplay(parsed, options) -- Formats a display string based on a parsed link table (matching the -- output of parseLink) and an options table (matching the input options for -- _formatLink). local page = maybeItalicize(parsed.page, options.italicizePage) local section = maybeItalicize(parsed.section, options.italicizeSection) if (not section) then return page elseif (not page) then return mw.ustring.format('§&nbsp;%s', section) else return mw.ustring.format('%s §&nbsp;%s', page, section) end end local function missingArgError(target) mError = require('Module:Error') return mError.error{message = 'Error: no link or target specified! ([[' .. target .. '#Errors|help]])' } end -------------------------------------------------------------------------------- -- Main functions -------------------------------------------------------------------------------- function p.formatLink(frame) -- The formatLink export function, for use in templates. yesno = require('Module:Yesno') local args = getArgs(frame) local link = args[1] or args.link local target = args[3] or args.target if not (link or target) then return missingArgError('Template:Format link') end return p._formatLink{ link = link, display = args[2] or args.display, target = target, italicizePage = yesno(args.italicizepage), italicizeSection = yesno(args.italicizesection), categorizeMissing = args.categorizemissing } end function p._formatLink(options) -- The formatLink export function, for use in modules. checkType('_formatLink', 1, options, 'table') local function check(key, expectedType) --for brevity checkTypeForNamedArg( '_formatLink', key, options[key], expectedType or 'string', true ) end check('link') check('display') check('target') check('italicizePage', 'boolean') check('italicizeSection', 'boolean') check('categorizeMissing') -- Normalize link and target and check that at least one is present if options.link == '' then options.link = nil end if options.target == '' then options.target = nil end if not (options.link or options.target) then return missingArgError('Module:Format link') end local parsed = parseLink(options.link) local display = options.display or parsed.display local catMissing = options.categorizeMissing local category = '' -- Find the display text if not display then display = formatDisplay(parsed, options) end -- Handle the target option if present if options.target then local parsedTarget = parseLink(options.target) parsed.link = parsedTarget.link parsed.page = parsedTarget.page end -- Test if page exists if a diagnostic category is specified if catMissing and (mw.ustring.len(catMissing) > 0) then local title = nil if parsed.page then title = mw.title.new(parsed.page) end if title and (not title.isExternal) then local success, exists = pcall(function() return title.exists end) if success and not exists then category = mw.ustring.format('[[Category:%s]]', catMissing) end end end -- Format the result as a link if parsed.link == display then return mw.ustring.format('[[:%s]]%s', parsed.link, category) else return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category) end end -------------------------------------------------------------------------------- -- Derived convenience functions -------------------------------------------------------------------------------- function p.formatPages(options, pages) -- Formats an array of pages using formatLink and the given options table, -- and returns it as an array. Nil values are not allowed. local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink{ link = page, categorizeMissing = options.categorizeMissing, italicizePage = options.italicizePage, italicizeSection = options.italicizeSection } end return ret end return p 5c878065ff3809629376f94da43cf39a395b01b1 Module:Format link/doc 828 96 113 2023-10-08T05:24:21Z Silentg 2 Created page with "<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{used in system|in [[MediaWiki:Perfcachedts]]}} This module, migrated from origins in [[Module:Hatnote]], provides functionality for formatting links for display, including that powering the {{tl|format link}} template. It can pretty-format section links with the section symbol ("§") and appropriate whitespace, it automatically escapes category and file names with the Help:..." wikitext text/x-wiki <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{used in system|in [[MediaWiki:Perfcachedts]]}} This module, migrated from origins in [[Module:Hatnote]], provides functionality for formatting links for display, including that powering the {{tl|format link}} template. It can pretty-format section links with the section symbol ("§") and appropriate whitespace, it automatically escapes category and file names with the [[Help:Colon trick|colon trick]], and includes functionality for italicizing the page or section name, and for detecting and categorizing results that produce [[Wikipedia:Red link|red links]]. == Use from wikitext == The functions in this module cannot be used directly from #invoke, and must be used through templates instead. Please see [[Template:Format link]] for documentation on usage of that template. == Use from other Lua modules== To load this module from another Lua module, use the following code: <syntaxhighlight lang="lua"> local mFormatLink = require('Module:Format link') </syntaxhighlight> You can then use the functions as documented below. === _formatLink === <syntaxhighlight lang="lua"> mFormatLink._formatLink{ link = 'Link', display = 'Display', target = 'Target', italicizePage = true, italicizeSection = true, categorizeMissing = 'Pages using formatted red links' } </syntaxhighlight> Formats <var>link</var> as a wikilink. Categories and files are automatically escaped with the [[Help:Colon trick|colon trick]], and links to sections are automatically formatted as ''page § section'', rather than the MediaWiki default of ''page#section''. Several options modify the output: * If the <var>display</var> value is present, then it will be used as a display value. Any manual piping (using the <code><nowiki>{{!}}</nowiki></code> magic word or similar) present in <var>link</var> will be overridden by the <var>display</var> value if present. * If the <var>target</var> value is present, then it will override <var>link</var> as a target, but the result will still be ''displayed'' using either the value from <var>display</var>, or the result of formatting <var>link</var>. * If <var>italicizePage</var> is true, then the page portion of the link is italicized if present. * If <var>italicizeSection</var> is true, then the section portion of the link is italicized if present. * If <var>categorizeMissing</var> is a non-empty string, then that value is used as a category name, and that category will be applied if the resulting target of the link (no matter whether through <var>link</var> or through <var>target</var>) doesn't exist. ;Examples: : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Foo#Bar'}</syntaxhighlight> &rarr; <nowiki>[[:Foo#Bar|Foo §&amp;nbsp;Bar]]</nowiki> &rarr; {{format link|Foo#Bar}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Baz', display = 'Qux'}</syntaxhighlight> &rarr; <nowiki>[[:Baz|Qux]]</nowiki> &rarr; {{format link|Baz|Qux}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Foo|Bar', display = 'Baz'}</syntaxhighlight> &rarr; <nowiki>[[:Foo|Baz]]</nowiki> &rarr; {{format link|Foo{{!}}Bar|Baz}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = '#Foo', target = 'Example#Foo'}</syntaxhighlight> &rarr; <nowiki>[[:Example#Foo|§&amp;nbsp;Foo]]</nowiki> &rarr; {{format link|#Foo||Example#Foo}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'The Lord of the Rings#Plot', italicizePage = true}</syntaxhighlight> &rarr; <nowiki>[[:The Lord of the Rings#Plot|''The Lord of the Rings'' §&amp;nbsp;Plot]]</nowiki> &rarr; {{format link|The Lord of the Rings#Plot|italicizepage=true}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice', italicizeSection = true}</syntaxhighlight> &rarr; <nowiki>[[:Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice|Cybercrime Prevention Act of 2012 §&amp;nbsp;''Disini v. Secretary of Justice'']]</nowiki> &rarr; {{format link|Cybercrime Prevention Act of 2012#Disini v. Secretary of Justice|italicizesection=true}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Nonexistent page', categorizeMissing = 'Example'}</syntaxhighlight> &rarr; <nowiki>[[:Nonexistent page]][[Category:Example]]</nowiki> &rarr; {{format link|Nonexistent page}} : <syntaxhighlight lang="lua" inline>mFormatLink._formatLink{link = 'Existing', categorizeMissing = 'Example'}</syntaxhighlight> &rarr; <nowiki>[[:Existing]]</nowiki> &rarr; {{format link|Existing}} === formatPages === <syntaxhighlight lang="lua"> mFormatLink.formatPages(options, pages) </syntaxhighlight> This derived function is useful for lists that format many links. It formats an array of pages using the [[#_formatLink|_formatLink]] function, and returns the result as an array. Options in the <var>options</var> table are applied, and use the same names as the options for <var>_formatLink</var>. ;Example :{{code|<nowiki>mFormatLink.formatPages({categorizeMissing = 'Example'}, {'Foo#Bar', 'Nonexistent page'})</nowiki>|lua}} &rarr; {{code|<nowiki>{'[[:Foo#Bar|Foo §&nbsp;Bar]]', '[[:Nonexistent page]][[Category:Example]]'}</nowiki>|lua}} == Errors == If <var>_formatLink</var> is used and neither a <var>link</var> nor a <var>target</var> argument is provided, then the module will produce an error message instead of its usual output, as it ''cannot'' then produce valid output. You can solve this error by providing appropriate parameters to <var>_formatLink</var>, or you may want to ensure that a more descriptive error is provided by a downstream template or module when it would otherwise call <var>_formatLink</var> with inadequate arguments. <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> }}</includeonly> 14a0e689d62837cacb851622e107ceb7dd886c88 Template:High-use 10 97 114 2023-10-08T05:28:52Z Silentg 2 Created page with "{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude> {{Documentation}} <!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! --> </noinclude>" wikitext text/x-wiki {{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude> {{Documentation}} <!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! --> </noinclude> a3322d1bd47ac03df14fa2090855cff4fede9bc7 Template:High-use/doc 10 98 115 2023-10-08T05:29:13Z Silentg 2 Created page with "{{Documentation subpage}} <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{High-use}} {{lua|Module:High-use}} This is the {{tlx|high-use}} message box. It is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, then a stronger wording is given. '''Note''': I..." wikitext text/x-wiki {{Documentation subpage}} <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{High-use}} {{lua|Module:High-use}} This is the {{tlx|high-use}} message box. It is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, then a stronger wording is given. '''Note''': It is normal that some of the links in the message box are red. == Usage == {{tlx |High-use}} {{tlx |High-use |2=2=''discussion page, or use + notation'' |3=info=''additional text'' }} '''all parameters''' <pre style="overflow:auto;"> {{High-use |1= |2= |info= |demo= |form= |expiry= }} </pre> The template can be used as is, and will automatically use bot-updated transclusion counts from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]], when available. It can also take some parameters: * <code>1=''number of transclusions''</code>: ''(deprecated)'' The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored, if transclusion data is available for the current page (generally, for templates with more than 2,000 transclusions). * <code>2=''discussion page, or use + notation''</code>: The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]), * {{para|info|&lt;{{var|extra information}}>}}: When set to non-blank, will insert &lt;{{var|extra information}}> into the template text. * {{para|demo|&lt;{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki>&lt;{{var|Template_name}}>]]</code> instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]]. * {{para|form}}: When set to "<code>editnotice</code>", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}. * {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}. * {{para|no-percent|yes}}: suppresses automatic 'percent of all pages' annotation; 'percent of all pages' annotation is automatically added when template is used in more than 1% of all pages (currently <code><nowiki>{{NUMBEROFPAGES}}</nowiki></code> is {{NUMBEROFPAGES}} pages so 1% is {{formatnum:{{#expr:trunc ({{formatnum:{{NUMBEROFPAGES}}|R}}/100)}}}} pages) == Examples == The full code for a /doc page top usually looks like this: <pre> {{documentation subpage}} <!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --> {{high-use}} </pre> === Standard form === {{nowiki template demo|code=<nowiki>{{high-use}}</nowiki>}} {{nowiki template demo|code=<nowiki>{{high-use | |Wikipedia talk:High-risk templates }}</nowiki>}} === Rounding and + notation === {{nowiki template demo|code=<nowiki>{{high-use |49,500 |demo=A template that does not exist }}</nowiki>}} {{nowiki template demo|code=<nowiki>{{high-use |49,500+ |demo=A template that does not exist }}</nowiki>}} === Editnotice form === {{nowiki template demo|code=<nowiki>{{high-use |form=editnotice }}</nowiki>}} === High risk === {{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno }}</nowiki>}} {{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno |no-percent=yes}}</nowiki>}} {{nowiki template demo|code=<nowiki>{{high-use |risk |demo=High-use }}</nowiki>}} {{nowiki template demo|code=<nowiki>{{high-use |risk |Wikipedia talk:High-risk templates |info=This is a very large number! |demo=Yesno}}</nowiki>}} == Technical details == The [[Template:High-use/sandbox|/sandbox]] and [[Template:High-use/testcases|/testcases]] links are the standard names for such subpages. If those pages are created, then the green /doc box for the template will detect them and link to them in its heading. For instance, see the top of this documentation. [[User:Ahechtbot|Ahechtbot]] compiles usage statistics for all templates with 2,000 or more transclusions, using [[User:Ahechtbot/transclusioncount.py]], and writes them to subpages of [[Module:Transclusion count/data]] (see [[Wikipedia:Bots/Requests for approval/Ahechtbot 6]]). These pages are usually updated every Sunday, but since running the query is resource intensive, it may be delayed or skipped if Wikipedia server usage is high. '''Important''': If a transclusion count is available in [[Module:Transclusion count/data]], any manually input values will be ignored by this template. == Supporting templates and modules == * {{tl|ombox}} which uses {{module link|Message box|ombox}} * {{tl|editnotice}} which uses {{module link|Message box|fmbox}} * {{module link|high-use|main}} * {{module link|transclusion count|fetch}} ==Redirects== {{columns-list|colwidth=15em| *{{tl|heavilytranscluded}} *{{tl|high risk}} *{{tl|high-risk}} *{{tl|high use}} *{{tl|risky template}} }} == See also == * {{tl|Intricate template}} – for templates that are complex, using less obvious techniques * {{tl|Interconnected template}} – for templates that have dependencies on others, or on config files, subpages, dynamic doc, etc. * {{tl|pp-template}} – protection template that usually is put on high-risk templates * {{tl|Used in system}} – for templates used in the Wikipedia user interface * [[Wikipedia:High-risk templates]] * [[Wikipedia:Template sandbox and test cases]] == Template counters == * [[toollabs:templatecount/]] – easy to use, returns current (real time) transclusion count for a template * <span class="plainlinks">[{{fullurl:Special:MostLinkedTemplates|limit=500}} Special:MostLinkedTemplates]</span> – special page search for most transcluded templates * [[Special:PrefixIndex/Module:Transclusion_count/data/]] – template count data used by this template that is broken down by first letter of template and rounded to two or three significant figures, and updated weekly * [[Wikipedia:Database reports/Templates transcluded on the most pages]] – lists the 1000 most transcluded templates, not updated since November 2018 <!-- * [[tools:~dispenser/cgi-bin/embeddedincount.py]] – Seems to lack human interface, probably meant for programs to call. (not working anymore) --> <includeonly>{{sandbox other|| <!-- Categories go below this line, please; interwikis go to Wikidata, thank you! --> [[Category:Documentation header templates]] }}</includeonly> == TemplateData == <!-- 'system' parameter is undocumented and probably should not be here. --> <templatedata> { "params": { "1": { "label": "number of transclusions (DEPRECATED)", "description": "either a static number of times the template has been transcluded, or the word \"risk\" (without quotes) to display \"a very large number of\" instead of the actual value.", "type": "string", "suggestedvalues": [ "risk" ], "deprecated": "This value will be ignored, if transclusion data is available for the current page." }, "2": { "label": "discussion page, or use + notation", "description": "The second parameter is overloaded. It will cause the number of transclusions to display as \"#,###+\" instead of \"approximately #,###\" when set equal to \"yes\" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, 2=WP:VPT will insert a link to WP:VPT)", "type": "string", "default": " ", "autovalue": " " }, "info": { "label": "Extra information", "description": "When set to non-blank, will insert the value of this parameter into the template text.", "type": "content" }, "demo": { "label": "template name (intended for demo purposes)", "description": "Will use the transclusion count for the template at [[Template:<Template_name>]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in Special:PrefixIndex/Module:Transclusion_count/data/.", "type": "string" }, "form": { "label": "form for this template", "description": "When set to \"editnotice\", will display the message using {{editnotice}} instead of {{ombox}}.", "type": "string", "suggestedvalues": [ "editnotice", " " ] }, "expiry": { "label": "Expiry for {{editnotice}}", "description": "if `form=editnotice`, this will set the expiry parameter of the editnotice.", "type": "date" }, "system": {} }, "description": "This is the {{high-use}} message box.\n\nIt is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to risk, then a stronger wording is given.\n\nNote: It is normal that some of the links in the message box are red. ", "format": "inline" } </templatedata> 92e6eceabb8cc4343fdb7d49a052fa3b3a473819 Module:High-use 828 99 116 2023-10-08T05:30:51Z Silentg 2 Created page with "local p = {} -- _fetch looks at the "demo" argument. local _fetch = require('Module:Transclusion_count').fetch local yesno = require('Module:Yesno') function p.num(frame, count) if count == nil then if yesno(frame.args['fetch']) == false then if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end else count = _fetch(frame) end end -- Build output string local return_value = "" if count == nil then if frame.args[1] == "risk" then..." Scribunto text/plain local p = {} -- _fetch looks at the "demo" argument. local _fetch = require('Module:Transclusion_count').fetch local yesno = require('Module:Yesno') function p.num(frame, count) if count == nil then if yesno(frame.args['fetch']) == false then if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end else count = _fetch(frame) end end -- Build output string local return_value = "" if count == nil then if frame.args[1] == "risk" then return_value = "a very large number of" else return_value = "many" end else -- Use 2 significant figures for smaller numbers and 3 for larger ones local sigfig = 2 if count >= 100000 then sigfig = 3 end -- Prepare to round to appropriate number of sigfigs local f = math.floor(math.log10(count)) - sigfig + 1 -- Round and insert "approximately" or "+" when appropriate if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then -- Round down return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) ) else -- Round to nearest return_value = string.format("approximately&#x20;%s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) ) end -- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5) if percent >= 1 then return_value = string.format("%s&#x20;pages, or roughly %s%% of all", return_value, percent) end end end return return_value end -- Actions if there is a large (greater than or equal to 100,000) transclusion count function p.risk(frame) local return_value = "" if frame.args[1] == "risk" then return_value = "risk" else local count = _fetch(frame) if count and count >= 100000 then return_value = "risk" end end return return_value end function p.text(frame, count) -- Only show the information about how this template gets updated if someone -- is actually editing the page and maybe trying to update the count. local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or '' if count == nil then if yesno(frame.args['fetch']) == false then if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end else count = _fetch(frame) end end local title = mw.title.getCurrentTitle() if title.subpageText == "doc" or title.subpageText == "sandbox" then title = title.basePageTitle end local systemMessages = frame.args['system'] if frame.args['system'] == '' then systemMessages = nil end -- This retrieves the project URL automatically to simplify localiation. local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format( mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'), mw.uri.encode(title.fullText), p.num(frame, count)) local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used '; if systemMessages then used_on_text = used_on_text .. systemMessages .. ((count and count > 2000) and ("''', and " .. templateCount) or ("'''")) else used_on_text = used_on_text .. templateCount .. "'''" end local sandbox_text = ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format( (mw.title.getCurrentTitle().namespace == 828 and "module" or "template"), title.fullText, title.fullText, mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage" ) local infoArg = frame.args["info"] ~= "" and frame.args["info"] if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.' if infoArg then info = info .. "<br />" .. infoArg end sandbox_text = info .. '<br /> To avoid major disruption' .. (count and count >= 100000 and ' and server load' or '') .. ', any changes should be tested in the ' .. sandbox_text .. 'The tested changes can be added to this page in a single edit. ' else sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') .. 'hanges may be widely noticed. Test changes in the ' .. sandbox_text end local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes ' if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"]) else discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText ) end return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text end function p.main(frame) local count = nil if yesno(frame.args['fetch']) == false then if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end else count = _fetch(frame) end local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]" local type_param = "style" local epilogue = '' if frame.args['system'] and frame.args['system'] ~= '' then image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]" type_param = "content" local nocat = frame:getParent().args['nocat'] or frame.args['nocat'] local categorise = (nocat == '' or not yesno(nocat)) if categorise then epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}') end elseif (frame.args[1] == "risk" or (count and count >= 100000)) then image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]" type_param = "content" end if frame.args["form"] == "editnotice" then return frame:expandTemplate{ title = 'editnotice', args = { ["image"] = image, ["text"] = p.text(frame, count), ["expiry"] = (frame.args["expiry"] or "") } } .. epilogue else return require('Module:Message box').main('ombox', { type = type_param, image = image, text = p.text(frame, count), expiry = (frame.args["expiry"] or "") }) .. epilogue end end return p 134551888e066954a89c109d2faa8af71a4454a4 Module:High-use/doc 828 100 117 2023-10-08T05:32:10Z Silentg 2 Created page with "{{Module rating|release}} {{High-use|demo=Module:{{ROOTPAGENAME}}}} {{Lua|Module:Effective protection level|Module:Message box|Module:Transclusion count|Module:Yesno}} Implements {{tl|High-use}}. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == {{Mlx|High-use|main|1{{=}}''number of transclusions''|2{{=}}''discussion page, or use + notation''|all-pages{{=}}|info{..." wikitext text/x-wiki {{Module rating|release}} {{High-use|demo=Module:{{ROOTPAGENAME}}}} {{Lua|Module:Effective protection level|Module:Message box|Module:Transclusion count|Module:Yesno}} Implements {{tl|High-use}}. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == {{Mlx|High-use|main|1{{=}}''number of transclusions''|2{{=}}''discussion page, or use + notation''|all-pages{{=}}|info{{=}}|demo{{=}}|form{{=}}|expiry{{=}}}} * ''<code>number of transclusions</code>'': The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored if transclusion data is available for the current page. * ''<code>discussion page, or use + notation</code>'': The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]), * {{para|all-pages|yes}}: Will also output what percentage of all pages use the template. This should only be used for very highly transcluded templates, and the percentage will only display if its greater than 1%. * {{para|info|''extra information''}}: When set to non-blank, will insert ''extra information'' into the template text if the template has more than 10,000 transclusions or parameter 1 is set to "risk". * {{para|demo|''Template_name''}}: Will use the transclusion count for the template at [[Template:Template_name]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]]. * {{para|form}}: When set to "editnotice", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}. * {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}. * {{para|system|''in system messages''}}: if set, this module looks like {{tl|Used in system}}. Use that template directly as it performs some checks. * {{para|fetch}}: if set to false, the module will not attempt to fetch transclusion counts using [[:Module:Transclusion count]] === Other functions === ; num : Produces the text and and link to toolforge surrounding the amount of transclusions. ; risk : With this function, if <code>risk</code> is passed into the first unnamed parameter, or there are more than 100k transclusions, this will return <code>risk</code>. ; text : Returns the body text of this template, with nil or a number of transclusions. e00df5ef600f39151d739e7b48c32a5f218e7949 Module:Transclusion count 828 101 118 2023-10-08T05:33:21Z Silentg 2 Created page with "local p = {} function p.fetch(frame) local template = nil local return_value = nil -- Use demo parameter if it exists, otherswise use current template name local namespace = mw.title.getCurrentTitle().namespace if frame.args["demo"] and frame.args["demo"] ~= "" then template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","") elseif namespace == 10 then -- Template namespace template = mw.title.getCurrentTitle().text elseif namespace == 828 then -- Modu..." Scribunto text/plain local p = {} function p.fetch(frame) local template = nil local return_value = nil -- Use demo parameter if it exists, otherswise use current template name local namespace = mw.title.getCurrentTitle().namespace if frame.args["demo"] and frame.args["demo"] ~= "" then template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","") elseif namespace == 10 then -- Template namespace template = mw.title.getCurrentTitle().text elseif namespace == 828 then -- Module namespace template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text) end -- If in template or module namespace, look up count in /data if template ~= nil then namespace = mw.title.new(template, "Template").namespace if namespace == 10 or namespace == 828 then template = mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end template = mw.ustring.gsub(template, "/sandbox$", "") -- strip /sandbox from end local index = mw.ustring.sub(mw.title.new(template).text,1,1) local status, data = pcall(function () return(mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other"))) end) if status then return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")]) end end end -- If database value doesn't exist, use value passed to template if return_value == nil and frame.args[1] ~= nil then local arg1=mw.ustring.match(frame.args[1], '[%d,]+') if arg1 and arg1 ~= '' then return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R')) end end return return_value end -- Tabulate this data for [[Wikipedia:Database reports/Templates transcluded on the most pages]] function p.tabulate(frame) local list = {} for i = 65, 91 do local data = mw.loadData('Module:Transclusion count/data/' .. ((i == 91) and 'other' or string.char(i))) for name, count in pairs(data) do table.insert(list, {mw.title.new(name, "Template").fullText, count}) end end table.sort(list, function(a, b) return (a[2] == b[2]) and (a[1] < b[1]) or (a[2] > b[2]) end) local lang = mw.getContentLanguage(); for i = 1, #list do list[i] = ('|-\n| %d || [[%s]] || %s\n'):format(i, list[i][1]:gsub('_', ' '), lang:formatNum(list[i][2])) end return table.concat(list) end return p 000ef6bcbf7b66e727870b0c300c4009da300513 Module:Transclusion count/doc 828 102 119 2023-10-08T05:36:58Z Silentg 2 Created page with "{{Module rating |beta}} {{high-use}} Fetches usage data for highly-transcluded templates. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|fetch|''number of transclusions''|''use + notation''|all-pages=|demo=}}</code> * ''<code>number of transclusions</code>'': is a static number of times the template has been tr..." wikitext text/x-wiki {{Module rating |beta}} {{high-use}} Fetches usage data for highly-transcluded templates. Uses bot-updated values from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]] when available. == Usage == <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|fetch|''number of transclusions''|''use + notation''|all-pages=|demo=}}</code> * ''<code>number of transclusions</code>'': is a static number of times the template has been transcluded, to use when values cannot be read from the database. This value will be ignored if transclusion data is available for the current page. * <code>demo=''Template_name''</code>: will use the transclusion count for the template at [[Template:Template_name]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]]. <code><nowiki>{{</nowiki>#invoke:{{BASEPAGENAME}}|tabulate}}</code> * Used to generate [[Wikipedia:Database reports/Templates transcluded on the most pages]]. == Notices == * The number of transclusion count is generated via subpages of [[Special:PrefixIndex/Module:Transclusion count/data/|Module:Transclusion count/data]] when is avaliable and is automatically updated via a bot. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> a0830db7362232d64780cb4dd940adaffc544c08 Template:Lua 10 103 120 2023-10-08T05:38:24Z Silentg 2 Created page with "<includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude> {{Lua|Module:Lua banner}} {{documentation}} <!-- Categories go on the /doc subpage and interwikis go on Wikidata. --> </noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude> {{Lua|Module:Lua banner}} {{documentation}} <!-- Categories go on the /doc subpage and interwikis go on Wikidata. --> </noinclude> dba3962144dacd289dbc34f50fbe0a7bf6d7f2f7 Template:Lua/doc 10 104 121 2023-10-08T05:38:58Z Silentg 2 Created page with "{{Documentation subpage}} {{Template shortcut|Lua talk}} {{Lua|Module:Lua banner}} <!-- Categories go at the bottom of this page, and interwikis go on Wikidata. --> {{for|template to indicate [[Luba-Kasai language]] words|Template:Lang-lua}} This template is used to indicate that a template uses one or more [[Lua (programming language)|Lua]] modules (pages in the <code>Module:</code> namespace). It is placed at the top of the template's /doc page. It automatically adds a..." wikitext text/x-wiki {{Documentation subpage}} {{Template shortcut|Lua talk}} {{Lua|Module:Lua banner}} <!-- Categories go at the bottom of this page, and interwikis go on Wikidata. --> {{for|template to indicate [[Luba-Kasai language]] words|Template:Lang-lua}} This template is used to indicate that a template uses one or more [[Lua (programming language)|Lua]] modules (pages in the <code>Module:</code> namespace). It is placed at the top of the template's /doc page. It automatically adds a floating right notification box, and it adds the template to [[:Category:Lua-based templates]] or to one of its subcategories. == Usage == ; Basic : {{tlx|Lua|''module name''}} ; All parameters : {{tlx|Lua|''module 1''|''module 2''|''module 3''|...|category{{=}}''custom category''|nocat{{=}}''true''}} The first module name is required. == Examples == * {{tlx|Lua|Module:Example}} {{Lua|Module:Example|nocat=true}} {{clear}} * {{tlx|Lua|Module:Example|Module:Example}} {{Lua|Module:Example|Module:Example|nocat=true}} {{clear}} * {{tlx|Lua}} {{Lua|nocat=true}} {{clear}} == Categorisation == ===Template category=== This template adds pages to [[:Category:Lua-based templates]] if the page is in the template namespace, and it is not on any of the subpages /doc, /sandbox, /sandbox2 or /testcases. You can specify a different category with the {{para|category}} parameter, e.g. {{para|category|Lua String-based templates}}. Some modules have a default category other than [[:Category:Lua-based templates]]: * [[Module:String]] has the default category [[:Category:Templates based on the String Lua module]]. * [[Module:Math]] has the default category [[:Category:Templates based on the Math Lua module]]. * [[Module:BaseConvert]] has the default category [[:Category:Templates based on the BaseConvert Lua module]]. * [[Module:Citation/CS1]] has the default category [[:Category:Templates based on the Citation/CS1 Lua module]]. ===Error category=== If no modules are specified, the transcluded page will be added to [[:Category:Lua templates with errors]]. ===Category suppression=== To suppress all categorisation, use {{para|nocat|true}}. (As well as "true", the values "yes", "y", and "1" will also work.) == TemplateData == {{Format TemplateData|TNT=Lua banner}} == See also == * [[Wikipedia:Lua]] * {{tl|module rating}} * {{tl|Uses TemplateStyles}} <includeonly>{{Sandbox other| | <!-- Categories go here, and interwikis go on Wikidata. --> [[Category:Lua-based templates| ]] [[Category:Template namespace templates]] }}</includeonly> a0a237a34ba98213650e4c11064bd4c8f944fcc6 Module:Lua banner 828 105 122 2023-10-08T05:41:06Z Silentg 2 Created page with "-- This module implements the {{lua}} template. local yesno = require('Module:Yesno') local mList = require('Module:List') local mTableTools = require('Module:TableTools') local mMessageBox = require('Module:Message box') local p = {} function p.main(frame) local origArgs = frame:getParent().args local args = {} for k, v in pairs(origArgs) do v = v:match('^%s*(.-)%s*$') if v ~= '' then args[k] = v end end return p._main(args) end function p._main(args)..." Scribunto text/plain -- This module implements the {{lua}} template. local yesno = require('Module:Yesno') local mList = require('Module:List') local mTableTools = require('Module:TableTools') local mMessageBox = require('Module:Message box') local p = {} function p.main(frame) local origArgs = frame:getParent().args local args = {} for k, v in pairs(origArgs) do v = v:match('^%s*(.-)%s*$') if v ~= '' then args[k] = v end end return p._main(args) end function p._main(args) local modules = mTableTools.compressSparseArray(args) local box = p.renderBox(modules) local trackingCategories = p.rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args, modules) return box .. trackingCategories end function p.renderBox(modules) local boxArgs = {} if #modules < 1 then boxArgs.text = '<strong class="error">Error: no modules specified</strong>' else local moduleLinks = {} for i, module in ipairs(modules) do moduleLinks[i] = string.format('[[:%s]]', module) local maybeSandbox = mw.title.new(module .. '/sandbox') if maybeSandbox.exists then moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|sandbox]])', maybeSandbox.fullText) end end local moduleList = mList.makeList('bulleted', moduleLinks) local title = mw.title.getCurrentTitle() if title.subpageText == "doc" then title = title.basePageTitle end if title.contentModel == "Scribunto" then boxArgs.text = 'This module depends on the following other modules:' .. moduleList else boxArgs.text = 'This template uses [[Wikipedia:Lua|Lua]]:\n' .. moduleList end end boxArgs.type = 'notice' boxArgs.small = true boxArgs.image = '[[File:Lua-Logo.svg|30px|alt=|link=]]' return mMessageBox.main('mbox', boxArgs) end function p.rMp1oViPb3EdvcJ5kxoqe52RuaiK6YiUYo(args, modules, titleObj) if yesno(args.nocat) then return '' end local cats = {} -- Error category if #modules < 1 then cats[#cats + 1] = 'Lua templates with errors' end -- Lua templates category titleObj = titleObj or mw.title.getCurrentTitle() local subpageBlacklist = { doc = true, sandbox = true, sandbox2 = true, testcases = true } if not subpageBlacklist[titleObj.subpageText] then local protCatName if titleObj.namespace == 10 then local category = args.category if not category then local categories = { ['Module:String'] = 'Templates based on the String Lua module', ['Module:Math'] = 'Templates based on the Math Lua module', ['Module:BaseConvert'] = 'Templates based on the BaseConvert Lua module', ['Module:Citation/CS1'] = 'Templates based on the Citation/CS1 Lua module' } category = modules[1] and categories[modules[1]] category = category or 'Lua-based templates' end cats[#cats + 1] = category protCatName = "Templates using under-protected Lua modules" elseif titleObj.namespace == 828 then protCatName = "Modules depending on under-protected modules" end if not args.noprotcat and protCatName then local protLevels = { autoconfirmed = 1, extendedconfirmed = 2, templateeditor = 3, sysop = 4 } local currentProt if titleObj.id ~= 0 then -- id is 0 (page does not exist) if am previewing before creating a template. currentProt = titleObj.protectionLevels["edit"][1] end if currentProt == nil then currentProt = 0 else currentProt = protLevels[currentProt] end for i, module in ipairs(modules) do if module ~= "WP:libraryUtil" then local moduleProt = mw.title.new(module).protectionLevels["edit"][1] if moduleProt == nil then moduleProt = 0 else moduleProt = protLevels[moduleProt] end if moduleProt < currentProt then cats[#cats + 1] = protCatName break end end end end end for i, cat in ipairs(cats) do cats[i] = string.format('[[Category:%s]]', cat) end return table.concat(cats) end return p 81a5d855c66ec54c6f92c66444cc71df24f2867c Module:Lua banner/doc 828 106 123 2023-10-08T05:52:20Z Silentg 2 Created page with "{{high use}} {{Lua|Module:Yesno|Module:List|Module:TableTools|Module:Message box}} This module implements the {{tl|lua}} template. == Usage from wikitext == This module cannot be used directly from wikitext. It can only be used through the {{tl|lua}} template. Please see the template page for documentation. == Usage from Lua modules == To use this module from other Lua modules, first load the module. <syntaxhighlight lang="lua"> local mLuaBanner = require('Module:Lu..." wikitext text/x-wiki {{high use}} {{Lua|Module:Yesno|Module:List|Module:TableTools|Module:Message box}} This module implements the {{tl|lua}} template. == Usage from wikitext == This module cannot be used directly from wikitext. It can only be used through the {{tl|lua}} template. Please see the template page for documentation. == Usage from Lua modules == To use this module from other Lua modules, first load the module. <syntaxhighlight lang="lua"> local mLuaBanner = require('Module:Lua banner') </syntaxhighlight> You can then generate a side box using the _main function. <syntaxhighlight lang="lua"> mLuaBanner._main(args) </syntaxhighlight> The <var>args</var> variable should be a table containing the arguments to pass to the module. To see the different arguments that can be specified and how they affect the module output, please refer to the {{tl|lua}} template documentation. == Tracking category == * {{clc|Lua templates with errors}} <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Modules that add a tracking category]] }}</includeonly> 864df985eac89c7dc7d6168d9235ff11b9f13b47 Module:List 828 107 124 2023-10-08T05:53:06Z Silentg 2 Created page with "local libUtil = require('libraryUtil') local checkType = libUtil.checkType local mTableTools = require('Module:TableTools') local p = {} local listTypes = { ['bulleted'] = true, ['unbulleted'] = true, ['horizontal'] = true, ['ordered'] = true, ['horizontal_ordered'] = true } function p.makeListData(listType, args) -- Constructs a data table to be passed to p.renderList. local data = {} -- Classes and TemplateStyles data.classes = {} data.templatestyles = ''..." Scribunto text/plain local libUtil = require('libraryUtil') local checkType = libUtil.checkType local mTableTools = require('Module:TableTools') local p = {} local listTypes = { ['bulleted'] = true, ['unbulleted'] = true, ['horizontal'] = true, ['ordered'] = true, ['horizontal_ordered'] = true } function p.makeListData(listType, args) -- Constructs a data table to be passed to p.renderList. local data = {} -- Classes and TemplateStyles data.classes = {} data.templatestyles = '' if listType == 'horizontal' or listType == 'horizontal_ordered' then table.insert(data.classes, 'hlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Hlist/styles.css' } } elseif listType == 'unbulleted' then table.insert(data.classes, 'plainlist') data.templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plainlist/styles.css' } } end table.insert(data.classes, args.class) -- Main div style data.style = args.style -- Indent for horizontal lists if listType == 'horizontal' or listType == 'horizontal_ordered' then local indent = tonumber(args.indent) indent = indent and indent * 1.6 or 0 if indent > 0 then data.marginLeft = indent .. 'em' end end -- List style types for ordered lists -- This could be "1, 2, 3", "a, b, c", or a number of others. The list style -- type is either set by the "type" attribute or the "list-style-type" CSS -- property. if listType == 'ordered' or listType == 'horizontal_ordered' then data.listStyleType = args.list_style_type or args['list-style-type'] data.type = args['type'] -- Detect invalid type attributes and attempt to convert them to -- list-style-type CSS properties. if data.type and not data.listStyleType and not tostring(data.type):find('^%s*[1AaIi]%s*$') then data.listStyleType = data.type data.type = nil end end -- List tag type if listType == 'ordered' or listType == 'horizontal_ordered' then data.listTag = 'ol' else data.listTag = 'ul' end -- Start number for ordered lists data.start = args.start if listType == 'horizontal_ordered' then -- Apply fix to get start numbers working with horizontal ordered lists. local startNum = tonumber(data.start) if startNum then data.counterReset = 'listitem ' .. tostring(startNum - 1) end end -- List style -- ul_style and ol_style are included for backwards compatibility. No -- distinction is made for ordered or unordered lists. data.listStyle = args.list_style -- List items -- li_style is included for backwards compatibility. item_style was included -- to be easier to understand for non-coders. data.itemStyle = args.item_style or args.li_style data.items = {} for _, num in ipairs(mTableTools.numKeys(args)) do local item = {} item.content = args[num] item.style = args['item' .. tostring(num) .. '_style'] or args['item_style' .. tostring(num)] item.value = args['item' .. tostring(num) .. '_value'] or args['item_value' .. tostring(num)] table.insert(data.items, item) end return data end function p.renderList(data) -- Renders the list HTML. -- Return the blank string if there are no list items. if type(data.items) ~= 'table' or #data.items < 1 then return '' end -- Render the main div tag. local root = mw.html.create('div') for _, class in ipairs(data.classes or {}) do root:addClass(class) end root:css{['margin-left'] = data.marginLeft} if data.style then root:cssText(data.style) end -- Render the list tag. local list = root:tag(data.listTag or 'ul') list :attr{start = data.start, type = data.type} :css{ ['counter-reset'] = data.counterReset, ['list-style-type'] = data.listStyleType } if data.listStyle then list:cssText(data.listStyle) end -- Render the list items for _, t in ipairs(data.items or {}) do local item = list:tag('li') if data.itemStyle then item:cssText(data.itemStyle) end if t.style then item:cssText(t.style) end item :attr{value = t.value} :wikitext(t.content) end return data.templatestyles .. tostring(root) end function p.renderTrackingCategories(args) local isDeprecated = false -- Tracks deprecated parameters. for k, v in pairs(args) do k = tostring(k) if k:find('^item_style%d+$') or k:find('^item_value%d+$') then isDeprecated = true break end end local ret = '' if isDeprecated then ret = ret .. '[[Category:List templates with deprecated parameters]]' end return ret end function p.makeList(listType, args) if not listType or not listTypes[listType] then error(string.format( "bad argument #1 to 'makeList' ('%s' is not a valid list type)", tostring(listType) ), 2) end checkType('makeList', 2, args, 'table') local data = p.makeListData(listType, args) local list = p.renderList(data) local trackingCategories = p.renderTrackingCategories(args) return list .. trackingCategories end for listType in pairs(listTypes) do p[listType] = function (frame) local mArguments = require('Module:Arguments') local origArgs = mArguments.getArgs(frame, { valueFunc = function (key, value) if not value or not mw.ustring.find(value, '%S') then return nil end if mw.ustring.find(value, '^%s*[%*#;:]') then return value else return value:match('^%s*(.-)%s*$') end return nil end }) -- Copy all the arguments to a new table, for faster indexing. local args = {} for k, v in pairs(origArgs) do args[k] = v end return p.makeList(listType, args) end end return p 7a4f36a6e9cd56370bdd8207d23694124821dc1a Module:List/doc 828 108 125 2023-10-08T05:53:44Z Silentg 2 Created page with "{{used in system|in [[MediaWiki:Citethispage-content]]}} {{module rating|protected}} {{Lua|Module:TableTools|Module:Arguments}} {{Uses TemplateStyles|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module outputs various kinds of lists. At present, it supports bulleted lists, unbulleted lists, horizontal lists, ordered lists (numbered or alphabetical), and horizontal ordered lists. It allows for easy css styling of the list or of the individual list items..." wikitext text/x-wiki {{used in system|in [[MediaWiki:Citethispage-content]]}} {{module rating|protected}} {{Lua|Module:TableTools|Module:Arguments}} {{Uses TemplateStyles|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module outputs various kinds of lists. At present, it supports bulleted lists, unbulleted lists, horizontal lists, ordered lists (numbered or alphabetical), and horizontal ordered lists. It allows for easy css styling of the list or of the individual list items. == Usage == === Quick usage === {{pre|<nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function''<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...<nowiki>}}</nowiki>}} === All parameters === {{pre| <nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function'' <nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>... <nowiki>|start = </nowiki>''start number for ordered lists'' <nowiki>|type = </nowiki>''type of numbering for ordered lists'' <nowiki>|list_style_type = </nowiki>''type of marker for ordered lists (uses CSS)'' <nowiki>|class = </nowiki>''class'' <nowiki>|style = </nowiki>''style'' <nowiki>|list_style = </nowiki>''style for the list'' <nowiki>|item_style = </nowiki>''style for all list items'' <nowiki>|item1_style = </nowiki>''style for the first list item''<nowiki> |item2_style = </nowiki>''style for the second list item''<nowiki> |</nowiki>... <nowiki>|item1_value = </nowiki>''value for the first list item''<nowiki> |item2_value = </nowiki>''value for the second list item''<nowiki> |</nowiki>... <nowiki>|indent = </nowiki>''indent for horizontal lists'' <nowiki>}}</nowiki> }} === Arguments passed from parent template === {{pre|<nowiki>{{</nowiki>#invoke:list<nowiki>|</nowiki>''function''<nowiki>}}</nowiki>}} === Functions === {| class="wikitable" |- ! Function name ! Produces ! Example output ! Template using the function |- | <code>bulleted</code> | Bulleted lists | {{#invoke:list|bulleted|First item|Second item|Third item}} | {{tlx|bulleted list}} |- | <code>unbulleted</code> | Unbulleted lists | {{#invoke:list|unbulleted|First item|Second item|Third item}} | {{tlx|unbulleted list}} |- | <code>horizontal</code> | Horizontal bulleted lists | {{#invoke:list|horizontal|First item|Second item|Third item}} | {{tlx|hlist}} |- | <code>ordered</code> | Ordered lists (numbered lists and alphabetical lists) | {{#invoke:list|ordered|First item|Second item|Third item}} | {{tlx|ordered list}} |- | <code>horizontal_ordered</code> | Horizontal ordered lists | {{#invoke:list|horizontal_ordered|First item|Second item|Third item}} | {{tlx|horizontal ordered list}} |} == Parameters == * Positional parameters (<code>1</code>, <code>2</code>, <code>3</code>...) - these are the list items. If no list items are present, the module will output nothing. * <code>start</code> - sets the start item for ordered lists. This can be a start number for numbered lists, or a start letter for alphabetical lists. Horizontal ordered lists only support numbers. * <code>type</code> - the type of marker used in ordered lists. Possible values are "1" for numbers (the default), "A" for uppercase letters, "a" for lowercase letters, "I" for uppercase [[Roman numerals]], and "i" for lowercase Roman numerals. Not supported in horizontal ordered lists. See also the <code>list_style_type</code> parameter. * <code>list_style_type</code> - the type of marker used in ordered lists. This uses CSS styling, and has more types available than the <code>type</code> parameter, which uses an [[html attribute]]. Possible values are listed at [https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type MDN's list-style-type page]. Support may vary by browser. <code>list-style-type</code> is an alias for this parameter. * <code>class</code> - a custom class for the {{tag|div}} tags surrounding the list, e.g. <code>plainlinks</code>. * <code>style</code> - a custom css style for the {{tag|div}} tags surrounding the list, e.g. <code>font-size: 90%;</code>. * <code>list_style</code> - a custom css style for the list itself. The format is the same as for the {{para|style}} parameter. * <code>item_style</code> - a custom css style for all of the list items (the {{tag|li}} tags). The format is the same as for the {{para|style}} parameter. * <code>item1_style</code>, <code>item2_style</code>, <code>item3_style</code>... - custom css styles for each of the list items. The format is the same as for the {{para|style}} parameter. * <code>item1_value</code>, <code>item2_value</code>, <code>item3_value</code>... - custom value for the given list item. List items following the one given will increment from the specified value. The value should be a positive integer. (Note that this option only has an effect on ordered lists.) * <code>indent</code> - this parameter indents the list, for horizontal and horizontal ordered lists only. The value must be a number, e.g. <code>2</code>. The indent is calculated in [[Em (typography)|em]], and is 1.6 times the value specified. If no indent is specified, the default is zero. == Examples == === Bulleted lists === {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item}}</nowiki></code> | {{#invoke:list|bulleted|First item|Second item|Third item}} |- | <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item|item_style=color:blue;}}</nowiki></code> | {{#invoke:list|bulleted|First item|Second item|Third item|item_style=color:blue;}} |- | <code><nowiki>{{#invoke:list|bulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki></code> | {{#invoke:list|bulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}} |} === Unbulleted lists === {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item}}</nowiki></code> | {{#invoke:list|unbulleted|First item|Second item|Third item}} |- | <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item|item_style=color:blue;}}</nowiki></code> | {{#invoke:list|unbulleted|First item|Second item|Third item|item_style=color:blue;}} |- | <code><nowiki>{{#invoke:list|unbulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki></code> | {{#invoke:list|unbulleted|First item|Second item|Third item|item1_style=background-color:yellow;|item2_style=background-color:silver;}} |} === Horizontal lists === {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{#invoke:list|horizontal|First item|Second item|Third item}}</nowiki></code> | {{#invoke:list|horizontal|First item|Second item|Third item}} |- | <code><nowiki>{{#invoke:list|horizontal|First item|Second item|Third item|indent=2}}</nowiki></code> | {{#invoke:list|horizontal|First item|Second item|Third item|indent=2}} |} === Ordered lists === {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item}}</nowiki></code> | {{#invoke:list|ordered|First item|Second item|Third item}} |- | <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|start=3}}</nowiki></code> | {{#invoke:list|ordered|First item|Second item|Third item|start=3}} |- | Lowercase [[Roman numerals]]: <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|type=i}}</nowiki></code> | {{#invoke:list|ordered|First item|Second item|Third item|type=i}} |- | Lowercase [[Greek alphabet]]: <code><nowiki>{{#invoke:list|ordered|First item|Second item|Third item|list_style_type=lower-greek}}</nowiki></code> | {{#invoke:list|ordered|First item|Second item|Third item|list_style_type=lower-greek}} |} === Horizontal ordered lists === {| class="wikitable" ! Code !! Result |- | <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item}}</nowiki></code> | {{#invoke:list|horizontal_ordered|First item|Second item|Third item}} |- | <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item|start=3}}</nowiki></code> | {{#invoke:list|horizontal_ordered|First item|Second item|Third item|start=3}} |- | <code><nowiki>{{#invoke:list|horizontal_ordered|First item|Second item|Third item|indent=2}}</nowiki></code> | {{#invoke:list|horizontal_ordered|First item|Second item|Third item|indent=2}} |} == Tracking/maintenance category == * {{clc|List templates with deprecated parameters}} == See also == * [[Module:Separated entries]] <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Modules that add a tracking category]] }}</includeonly> b4031c1ae9765885d3ce8d96c78c8557f6887aa1 Template:Parameter names example 10 109 126 2023-10-08T05:55:06Z Silentg 2 Created page with "<includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude> {{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude> {{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --> </noinclude> 256a11b9ae7ac7e492b3d9de86ade1ffa96bffd1 Template:Parameter names example/doc 10 110 127 2023-10-08T05:55:30Z Silentg 2 Created page with "{{Documentation subpage}} <!----Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])----> {{Lua|Module:Parameter names example}} {{Template redirect|Generic template demo|Pnex}} {{tl|Parameter names example}}&nbsp;– or, alternatively, {{tl|Generic template demo}}&nbsp;– is intended to assist [[Wikipedia:Template documentation|template documentation]] by producing a generic instance of the template that u..." wikitext text/x-wiki {{Documentation subpage}} <!----Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])----> {{Lua|Module:Parameter names example}} {{Template redirect|Generic template demo|Pnex}} {{tl|Parameter names example}}&nbsp;– or, alternatively, {{tl|Generic template demo}}&nbsp;– is intended to assist [[Wikipedia:Template documentation|template documentation]] by producing a generic instance of the template that uses [[Help:Templates#Parameters|parameters' names]] as those parameters' values. {{clear}} ==Example== The example opposite for {{tl|Infobox}}, for instance, was produced by: {{Parameter names example |_template=Infobox |title |above |subheader |subheader2 |image |caption |header1 |label2 |data2 |label3 |data3 |header4 |data5 |data6 |below}} <pre style="overflow:auto;"> {{Parameter names example |_template=Infobox |title |above |subheader |subheader2 |image |caption |header1 |label2 |data2 |label3 |data3 |header4 |data5 |data6 |below }} </pre> ==Usage notes== When {{tlf|Parameter names example}} is used on an immediate subpage of its target template&nbsp;– e.g. on the target template's /doc page&nbsp;– its own {{para|_template}} parameter identifying the target template may be omitted. In other words, the code above, if used on Template:Infobox/''page'' (where ''page'' could be "doc", "testcases", etc.), would become: <pre style="overflow:auto;"> {{Parameter names example |title |above |subheader |subheader2 |image |caption |header1 |label2 |data2 |label3 |data3 |header4 |data5 |data6 |below }} </pre> One exception to this is the "sandbox" subpage. If the module is called from a page ending in "/sandbox", it uses that page to generate the template output, not the base page. To override this behaviour you can specify the {{para|_template}} parameter explicitly. The formatting of the parameter names can be changed with the {{para|_display}} parameter. By default, the parameter names are shown in triple braces (the [[m:Help:Templates#Parameters|parameter standard]], e.g. {{{name}}}{{thin space}}), but if {{para|_display|italics}} or {{para|_display|italic}} is set, they are shown in italics. A custom value for a parameter may be supplied by using {{para|[parameter name]|[value]}} in place of <code>|[parameter name]</code>. Any formatting for such a value&nbsp;– including, for instance, italics&nbsp;– must be supplied as part of the value (e.g. {{para|parameter|<nowiki>''value''<br/></nowiki>}}). Custom values cannot be used for parameters whose names begin with an underscore ("_"). == See also == * [[Wikipedia:Template documentation]] * [[Template:Parameters]] and [[Module:Parameters]] – generates a list of parameter names for a given template <includeonly>{{Sandbox other| | <!----Categories below this line, please; interwikis at Wikidata----> [[Category:Wikipedia utility templates]] [[Category:Template namespace templates]] [[Category:Documentation assistance templates]] }}</includeonly> 44fe789b86304de50c1d568d13787c8eae3655c5 Module:Parameter names example 828 111 128 2023-10-08T05:56:05Z Silentg 2 Created page with "-- This module implements {{parameter names example}}. local p = {} local function makeParam(s) local lb = '&#123;' local rb = '&#125;' return lb:rep(3) .. s .. rb:rep(3) end local function italicize(s) return "''" .. s .. "''" end local function plain(s) return s end function p._main(args, frame) -- Find how we want to format the arguments to the template. local formatFunc if args._display == 'italics' or args._display == 'italic' then formatFunc = italic..." Scribunto text/plain -- This module implements {{parameter names example}}. local p = {} local function makeParam(s) local lb = '&#123;' local rb = '&#125;' return lb:rep(3) .. s .. rb:rep(3) end local function italicize(s) return "''" .. s .. "''" end local function plain(s) return s end function p._main(args, frame) -- Find how we want to format the arguments to the template. local formatFunc if args._display == 'italics' or args._display == 'italic' then formatFunc = italicize elseif args._display == 'plain' then formatFunc = plain else formatFunc = makeParam end -- Build the table of template arguments. local targs = {} for k, v in pairs(args) do if type(k) == 'number' then targs[v] = formatFunc(v) elseif not k:find('^_') then targs[k] = v end end --targs['nocat'] = 'yes'; --targs['categories'] = 'no'; --targs['demo'] = 'yes'; -- Find the template name. local template if args._template then template = args._template else local currentTitle = mw.title.getCurrentTitle() if currentTitle.prefixedText:find('/sandbox$') then template = currentTitle.prefixedText else template = currentTitle.basePageTitle.prefixedText end end -- Call the template with the arguments. frame = frame or mw.getCurrentFrame() local success, result = pcall( frame.expandTemplate, frame, {title = template, args = targs} ) if success then return result else return '' end end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Parameter names example' }) return p._main(args, frame) end return p fdf94fb7a5dc1fabf118d60488a02f1e65b0df24 Module:Parameter names example/doc 828 112 129 2023-10-08T05:56:55Z Silentg 2 Created page with "{{Pnex |_template=Infobox |title |above |subheader |image |caption |header1 |label2 |data2 |label3 |data3 |below}} This module implements {{tl|Parameter names example}} (also known as {{tl|Generic template demo}}). It creates a template demonstration such as that shown opposite. Please see [[Template:Parameter names example|the template page]] for full documentation. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis a..." wikitext text/x-wiki {{Pnex |_template=Infobox |title |above |subheader |image |caption |header1 |label2 |data2 |label3 |data3 |below}} This module implements {{tl|Parameter names example}} (also known as {{tl|Generic template demo}}). It creates a template demonstration such as that shown opposite. Please see [[Template:Parameter names example|the template page]] for full documentation. <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | <!-- Categories below this line, please; interwikis at Wikidata --> }}</includeonly> 316e614070bb689ba87e0c034b05e76834321f41 Template:Strong 10 113 130 2023-10-08T05:58:16Z Silentg 2 Created page with "<strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude>" wikitext text/x-wiki <strong {{#if:{{{role|}}}|role="{{{role}}}"}} {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</strong><noinclude> {{documentation}} <!-- Add cats and interwikis to the /doc subpage, not here! --> </noinclude> a6c6d3b520e2018e19376e2f0e1a72801336d1df Template:Strong/doc 10 114 131 2023-10-08T05:58:35Z Silentg 2 Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE --> == Purpose == The {{Strong|Strong template}} makes it faster and easier to apply the {{tag|strong}} {{strong|importance, seriousness, or urgency}} [[HTML element]] to text, and more importantly to indicate to human editors and [[Wikipedia:Bots|Wikipedia bot]]s they should not use <code><nowiki>'''...'''</nowiki></code> or {{tag|b}} typographic boldfacing to replace the in..." wikitext text/x-wiki {{Documentation subpage}} <!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE --> == Purpose == The {{Strong|Strong template}} makes it faster and easier to apply the {{tag|strong}} {{strong|importance, seriousness, or urgency}} [[HTML element]] to text, and more importantly to indicate to human editors and [[Wikipedia:Bots|Wikipedia bot]]s they should not use <code><nowiki>'''...'''</nowiki></code> or {{tag|b}} typographic boldfacing to replace the intentional and [[Semantic Web|semantically meaningful]] {{tag|strong|open}}. The {{tag|strong}} element is usually rendered visually in a bold (heavy) typeface by default on graphical browsers, but can be parsed and acted upon in customizable ways with [[Style sheet (web development)|style sheets]], [[Application software|apps]], and text-to-speech [[screen reader]]s. It is [[semantic markup]], i.e. markup that conveys meaning or context, not just visual appearance. Simple boldfacing (<code><nowiki>'''...'''</nowiki></code> or {{tag|b}}) is purely typographic and is semantically meaningless. Boldface ({{tag|b}}) is most often used for headings, but has a few other uses (such as for book or film titles and the like, which are usually italicized, when they appear in an already-italicized passage). The average reader, and average editor, do not and need not care about this distinction most of the time, but it can be important and editors who understand it can use this template as a baseline insurance against accidental or uninformed replacement by bots and human editors, as well as to add [[web accessibility]]. == Usage == :{{tlnull|strong|<var>important text</var>}} or, if the important text contains an equals sign: :{{tlnull|strong|'''1{{=}}'''<var>important text</var>}} These both render as: :{{strong|important text}} This template puts intentional and explicit {{tag|strong}} (importance, seriousness, or urgency) HTML markup around the text provided as the first parameter. It is safest to always use the {{para|1}} syntax. ===Optional parameters=== Advanced HTML values can be passed through the template to the HTML code: * {{para|role}} takes a WAI-ARIA role; adds <code>role="<var>rolename</var>"</code> to the HTML code * {{para|class}} takes a class name (or multiple class names, separated by spaces); adds <code>class="<var>classname[s]</var>"</code> to the HTML code * {{para|style}} takes inline CSS input; adds <code>style="<var>CSS directive[s]</var>"</code> to the HTML code * {{para|id}} takes a valid, unique HTML id (must begin with an alphabetic letter); adds <code>id="<var>name</var>"</code> to the HTML code * {{para|title}} takes text, which cannot be marked up in any way, and displays it as a pop-up "tooltip" when the cursor hovers over the {{tnull|strong}} span ===Use cases=== {{more|Wikipedia:WikiProject Usability/Scannability}} This template is made to mark important words or phrases in a text, in a way that is (unlike simply boldfacing it) [[Semantic markup|semantically meaningful markup]]. With this technique, the important text strongly stands out from the rest in most if not all visual browsers and some text-to-speech screen readers (which usually ignore purely typographic boldfacing), and can also be parsed by user agents and other software as definitively indicating importance, not just some typographic boldface effect for appearance's sake. It should therefore only be used very sparingly in articles to highlight the most important words or phrases in the entire article (and, rarely in encyclopedic writing, to represent relative importance). Use of this template has a strong effect on {{Linktext|scannability}}, drawing the eye from elsewhere on the page to words marked up with the template. Typical uses on Wikipedia: * In the [[WP:LEAD|lead section of an article]], the article's title can be marked with {{tnull|strong}}. Example: "The {{strong|soma}} is the bulbous end of a neuron." {{As of|July 2022}}, there is no consensus either for or against this use.<ref>The style guidelines at [[MOS:BOLDTITLE]] and [[MOS:BOLDSYN]] recommend regular bolding. The use of this template has been briefly discussed [[Wikipedia talk:Manual of Style/Lead section/Archive 20#Shouldn't we use semantic markup in the lead?|in 2018]] and [[Template talk:Strong#Use in lead sections of articles|in 2022]].</ref> * After the lead, it {{em|can}} be used to highlight crucial terms of importance only slightly secondary to that of the article title and its synonyms. For example, the article on a viral infection might use {{tnull|strong}} to highlight the names of two identified strains of the disease in a "Varieties" section, as an aid to scannability. * In unusual cases (most often direct quotations) it is used to represent contextually important text, if the passage were spoken rather than written (e.g., because it indicates shouting). * Outside articles, it {{em|should}} be used (but {{as of|July 2021|lc=y}} isn't yet common) in polls, XfD processes, RfX votes, and similar comments and debates where users indicate that they approve of or disagree with a view or proposal. Example: "{{strong|Support}}, because of this and that reasons [...]" or "{{strong|Oppose}}, because of this and that reasons [...]". == When this template should not be used == Because {{tnull|strong}} is strictly for semantic (meaningful) importance, it should not be used for layout, typography conventions and such. In these different cases, bold <code><nowiki>'''...'''</nowiki></code> (which resolves to {{tag|b}} in the browser or other user agent) should be used instead. It also should not be used when the text to which it is applied is boldfaced for some other reason (e.g., it is part of a heading); in such cases use {{tlx|em}} instead. Avoid using {{tnull|strong}} in non-quoted sentences that end in an exclamation point. And it is usually excessive to use it on terms that are Wikilinked, since the link markup acts to indicate importance itself. ==See also== * {{tlx|strongbad}} – same but red * {{tlx|stronggood}} – same but green * {{tlx|em}} – for italic rather than bold semantic emphasis<br />&nbsp; == Notes == {{Reflist}} {{Semantic markup templates|show}} <includeonly>{{Sandbox other|| <!-- CATEGORIES BELOW THIS LINE, PLEASE: --> [[Category:Semantic markup templates]] [[Category:Wikipedia XHTML tag-replacing templates]] }}</includeonly> d57770ca63c42772e3b463cedb4cb3b0744779c2 Template:Terminate sentence 10 115 132 2023-10-08T05:59:49Z Silentg 2 Created page with "{{{1}}}{{#if:{{#invoke:text|sentenceTerminated|{{{1|}}}}}||{{{2|.}}}}}<noinclude>{{documentation}}</noinclude>" wikitext text/x-wiki {{{1}}}{{#if:{{#invoke:text|sentenceTerminated|{{{1|}}}}}||{{{2|.}}}}}<noinclude>{{documentation}}</noinclude> e4142b47b3d7959b82f582bab87ca10768d4d93b Template:Terminate sentence/doc 10 116 133 2023-10-08T06:00:22Z Silentg 2 Created page with "{{Documentation subpage}} {{Lua|Module:Text}} This template returns its first argument, after adding a full stop (or its second argument) if the sentence was not finished. == Usage == * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|The rain in Spain}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|falls mainly on the plain.}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|BANG|!}} <includeonly>{{sandbox other|| <!-- Categories below this line --> {{uncat}} }}</includeonly>" wikitext text/x-wiki {{Documentation subpage}} {{Lua|Module:Text}} This template returns its first argument, after adding a full stop (or its second argument) if the sentence was not finished. == Usage == * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|The rain in Spain}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|falls mainly on the plain.}} * {{#invoke:DemoTemplate|{{BASEPAGENAME}}|BANG|!}} <includeonly>{{sandbox other|| <!-- Categories below this line --> {{uncat}} }}</includeonly> db9d452de3f1bb665d5a8bcc447b1ab341dc711b Module:Text 828 117 134 2023-10-08T06:01:17Z Silentg 2 Created page with "local yesNo = require("Module:Yesno") local Text = { serial = "2022-07-21", suite = "Text" } --[=[ Text utilities ]=] -- local globals local PatternCJK = false local PatternCombined = false local PatternLatin = false local PatternTerminated = false local QuoteLang = false local QuoteType = false local RangesLatin = false local SeekQuote = false local function initLatinData() if not RangesLatin then..." Scribunto text/plain local yesNo = require("Module:Yesno") local Text = { serial = "2022-07-21", suite = "Text" } --[=[ Text utilities ]=] -- local globals local PatternCJK = false local PatternCombined = false local PatternLatin = false local PatternTerminated = false local QuoteLang = false local QuoteType = false local RangesLatin = false local SeekQuote = false local function initLatinData() if not RangesLatin then RangesLatin = { { 7, 687 }, { 7531, 7578 }, { 7680, 7935 }, { 8194, 8250 } } end if not PatternLatin then local range PatternLatin = "^[" for i = 1, #RangesLatin do range = RangesLatin[ i ] PatternLatin = PatternLatin .. mw.ustring.char( range[ 1 ], 45, range[ 2 ] ) end -- for i PatternLatin = PatternLatin .. "]*$" end end local function initQuoteData() -- Create quote definitions if not QuoteLang then QuoteLang = { af = "bd", ar = "la", be = "labd", bg = "bd", ca = "la", cs = "bd", da = "bd", de = "bd", dsb = "bd", et = "bd", el = "lald", en = "ld", es = "la", eu = "la", -- fa = "la", fi = "rd", fr = "laSPC", ga = "ld", he = "ldla", hr = "bd", hsb = "bd", hu = "bd", hy = "labd", id = "rd", is = "bd", it = "ld", ja = "x300C", ka = "bd", ko = "ld", lt = "bd", lv = "bd", nl = "ld", nn = "la", no = "la", pl = "bdla", pt = "lald", ro = "bdla", ru = "labd", sk = "bd", sl = "bd", sq = "la", sr = "bx", sv = "rd", th = "ld", tr = "ld", uk = "la", zh = "ld", ["de-ch"] = "la", ["en-gb"] = "lsld", ["en-us"] = "ld", ["fr-ch"] = "la", ["it-ch"] = "la", ["pt-br"] = "ldla", ["zh-tw"] = "x300C", ["zh-cn"] = "ld" } end if not QuoteType then QuoteType = { bd = { { 8222, 8220 }, { 8218, 8217 } }, bdla = { { 8222, 8220 }, { 171, 187 } }, bx = { { 8222, 8221 }, { 8218, 8217 } }, la = { { 171, 187 }, { 8249, 8250 } }, laSPC = { { 171, 187 }, { 8249, 8250 }, true }, labd = { { 171, 187 }, { 8222, 8220 } }, lald = { { 171, 187 }, { 8220, 8221 } }, ld = { { 8220, 8221 }, { 8216, 8217 } }, ldla = { { 8220, 8221 }, { 171, 187 } }, lsld = { { 8216, 8217 }, { 8220, 8221 } }, rd = { { 8221, 8221 }, { 8217, 8217 } }, x300C = { { 0x300C, 0x300D }, { 0x300E, 0x300F } } } end end -- initQuoteData() local function fiatQuote( apply, alien, advance ) -- Quote text -- Parameter: -- apply -- string, with text -- alien -- string, with language code -- advance -- number, with level 1 or 2 local r = apply and tostring(apply) or "" alien = alien or "en" advance = tonumber(advance) or 0 local suite initQuoteData() local slang = alien:match( "^(%l+)-" ) suite = QuoteLang[alien] or slang and QuoteLang[slang] or QuoteLang["en"] if suite then local quotes = QuoteType[ suite ] if quotes then local space if quotes[ 3 ] then space = "&#160;" else space = "" end quotes = quotes[ advance ] if quotes then r = mw.ustring.format( "%s%s%s%s%s", mw.ustring.char( quotes[ 1 ] ), space, apply, space, mw.ustring.char( quotes[ 2 ] ) ) end else mw.log( "fiatQuote() " .. suite ) end end return r end -- fiatQuote() Text.char = function ( apply, again, accept ) -- Create string from codepoints -- Parameter: -- apply -- table (sequence) with numerical codepoints, or nil -- again -- number of repetitions, or nil -- accept -- true, if no error messages to be appended -- Returns: string local r = "" apply = type(apply) == "table" and apply or {} again = math.floor(tonumber(again) or 1) if again < 1 then return "" end local bad = { } local codes = { } for _, v in ipairs( apply ) do local n = tonumber(v) if not n or (n < 32 and n ~= 9 and n ~= 10) then table.insert(bad, tostring(v)) else table.insert(codes, math.floor(n)) end end if #bad > 0 then if not accept then r = tostring( mw.html.create( "span" ) :addClass( "error" ) :wikitext( "bad codepoints: " .. table.concat( bad, " " )) ) end return r end if #codes > 0 then r = mw.ustring.char( unpack( codes ) ) if again > 1 then r = r:rep(again) end end return r end -- Text.char() local function trimAndFormat(args, fmt) local result = {} if type(args) ~= 'table' then args = {args} end for _, v in ipairs(args) do v = mw.text.trim(tostring(v)) if v ~= "" then table.insert(result,fmt and mw.ustring.format(fmt, v) or v) end end return result end Text.concatParams = function ( args, apply, adapt ) -- Concat list items into one string -- Parameter: -- args -- table (sequence) with numKey=string -- apply -- string (optional); separator (default: "|") -- adapt -- string (optional); format including "%s" -- Returns: string local collect = { } return table.concat(trimAndFormat(args,adapt), apply or "|") end -- Text.concatParams() Text.containsCJK = function ( s ) -- Is any CJK code within? -- Parameter: -- s -- string -- Returns: true, if CJK detected s = s and tostring(s) or "" if not patternCJK then patternCJK = mw.ustring.char( 91, 4352, 45, 4607, 11904, 45, 42191, 43072, 45, 43135, 44032, 45, 55215, 63744, 45, 64255, 65072, 45, 65103, 65381, 45, 65500, 131072, 45, 196607, 93 ) end return mw.ustring.find( s, patternCJK ) ~= nil end -- Text.containsCJK() Text.removeDelimited = function (s, prefix, suffix) -- Remove all text in s delimited by prefix and suffix (inclusive) -- Arguments: -- s = string to process -- prefix = initial delimiter -- suffix = ending delimiter -- Returns: stripped string s = s and tostring(s) or "" prefix = prefix and tostring(prefix) or "" suffix = suffix and tostring(suffix) or "" local prefixLen = mw.ustring.len(prefix) local suffixLen = mw.ustring.len(suffix) if prefixLen == 0 or suffixLen == 0 then return s end local i = s:find(prefix, 1, true) local r = s local j while i do j = r:find(suffix, i + prefixLen) if j then r = r:sub(1, i - 1)..r:sub(j+suffixLen) else r = r:sub(1, i - 1) end i = r:find(prefix, 1, true) end return r end Text.getPlain = function ( adjust ) -- Remove wikisyntax from string, except templates -- Parameter: -- adjust -- string -- Returns: string local r = Text.removeDelimited(adjust,"<!--","-->") r = r:gsub( "(</?%l[^>]*>)", "" ) :gsub( "'''", "" ) :gsub( "''", "" ) :gsub( "&nbsp;", " " ) return r end -- Text.getPlain() Text.isLatinRange = function (s) -- Are characters expected to be latin or symbols within latin texts? -- Arguments: -- s = string to analyze -- Returns: true, if valid for latin only s = s and tostring(s) or "" --- ensure input is always string initLatinData() return mw.ustring.match(s, PatternLatin) ~= nil end -- Text.isLatinRange() Text.isQuote = function ( s ) -- Is this character any quotation mark? -- Parameter: -- s = single character to analyze -- Returns: true, if s is quotation mark s = s and tostring(s) or "" if s == "" then return false end if not SeekQuote then SeekQuote = mw.ustring.char( 34, -- " 39, -- ' 171, -- laquo 187, -- raquo 8216, -- lsquo 8217, -- rsquo 8218, -- sbquo 8220, -- ldquo 8221, -- rdquo 8222, -- bdquo 8249, -- lsaquo 8250, -- rsaquo 0x300C, -- CJK 0x300D, -- CJK 0x300E, -- CJK 0x300F ) -- CJK end return mw.ustring.find( SeekQuote, s, 1, true ) ~= nil end -- Text.isQuote() Text.listToText = function ( args, adapt ) -- Format list items similar to mw.text.listToText() -- Parameter: -- args -- table (sequence) with numKey=string -- adapt -- string (optional); format including "%s" -- Returns: string return mw.text.listToText(trimAndFormat(args, adapt)) end -- Text.listToText() Text.quote = function ( apply, alien, advance ) -- Quote text -- Parameter: -- apply -- string, with text -- alien -- string, with language code, or nil -- advance -- number, with level 1 or 2, or nil -- Returns: quoted string apply = apply and tostring(apply) or "" local mode, slang if type( alien ) == "string" then slang = mw.text.trim( alien ):lower() else slang = mw.title.getCurrentTitle().pageLanguage if not slang then -- TODO FIXME: Introduction expected 2017-04 slang = mw.language.getContentLanguage():getCode() end end if advance == 2 then mode = 2 else mode = 1 end return fiatQuote( mw.text.trim( apply ), slang, mode ) end -- Text.quote() Text.quoteUnquoted = function ( apply, alien, advance ) -- Quote text, if not yet quoted and not empty -- Parameter: -- apply -- string, with text -- alien -- string, with language code, or nil -- advance -- number, with level 1 or 2, or nil -- Returns: string; possibly quoted local r = mw.text.trim( apply and tostring(apply) or "" ) local s = mw.ustring.sub( r, 1, 1 ) if s ~= "" and not Text.isQuote( s, advance ) then s = mw.ustring.sub( r, -1, 1 ) if not Text.isQuote( s ) then r = Text.quote( r, alien, advance ) end end return r end -- Text.quoteUnquoted() Text.removeDiacritics = function ( adjust ) -- Remove all diacritics -- Parameter: -- adjust -- string -- Returns: string; all latin letters should be ASCII -- or basic greek or cyrillic or symbols etc. local cleanup, decomposed if not PatternCombined then PatternCombined = mw.ustring.char( 91, 0x0300, 45, 0x036F, 0x1AB0, 45, 0x1AFF, 0x1DC0, 45, 0x1DFF, 0xFE20, 45, 0xFE2F, 93 ) end decomposed = mw.ustring.toNFD( adjust and tostring(adjust) or "" ) cleanup = mw.ustring.gsub( decomposed, PatternCombined, "" ) return mw.ustring.toNFC( cleanup ) end -- Text.removeDiacritics() Text.sentenceTerminated = function ( analyse ) -- Is string terminated by dot, question or exclamation mark? -- Quotation, link termination and so on granted -- Parameter: -- analyse -- string -- Returns: true, if sentence terminated local r if not PatternTerminated then PatternTerminated = mw.ustring.char( 91, 12290, 65281, 65294, 65311 ) .. "!%.%?…][\"'%]‹›«»‘’“”]*$" end if mw.ustring.find( analyse, PatternTerminated ) then r = true else r = false end return r end -- Text.sentenceTerminated() Text.ucfirstAll = function ( adjust) -- Capitalize all words -- Arguments: -- adjust = string to adjust -- Returns: string with all first letters in upper case adjust = adjust and tostring(adjust) or "" local r = mw.text.decode(adjust,true) local i = 1 local c, j, m m = (r ~= adjust) r = " "..r while i do i = mw.ustring.find( r, "%W%l", i ) if i then j = i + 1 c = mw.ustring.upper( mw.ustring.sub( r, j, j ) ) r = string.format( "%s%s%s", mw.ustring.sub( r, 1, i ), c, mw.ustring.sub( r, i + 2 ) ) i = j end end -- while i r = r:sub( 2 ) if m then r = mw.text.encode(r) end return r end -- Text.ucfirstAll() Text.uprightNonlatin = function ( adjust ) -- Ensure non-italics for non-latin text parts -- One single greek letter might be granted -- Precondition: -- adjust -- string -- Returns: string with non-latin parts enclosed in <span> local r initLatinData() if mw.ustring.match( adjust, PatternLatin ) then -- latin only, horizontal dashes, quotes r = adjust else local c local j = false local k = 1 local m = false local n = mw.ustring.len( adjust ) local span = "%s%s<span dir='auto' style='font-style:normal'>%s</span>" local flat = function ( a ) -- isLatin local range for i = 1, #RangesLatin do range = RangesLatin[ i ] if a >= range[ 1 ] and a <= range[ 2 ] then return true end end -- for i end -- flat() local focus = function ( a ) -- char is not ambivalent local r = ( a > 64 ) if r then r = ( a < 8192 or a > 8212 ) else r = ( a == 38 or a == 60 ) -- '&' '<' end return r end -- focus() local form = function ( a ) return string.format( span, r, mw.ustring.sub( adjust, k, j - 1 ), mw.ustring.sub( adjust, j, a ) ) end -- form() r = "" for i = 1, n do c = mw.ustring.codepoint( adjust, i, i ) if focus( c ) then if flat( c ) then if j then if m then if i == m then -- single greek letter. j = false end m = false end if j then local nx = i - 1 local s = "" for ix = nx, 1, -1 do c = mw.ustring.sub( adjust, ix, ix ) if c == " " or c == "(" then nx = nx - 1 s = c .. s else break -- for ix end end -- for ix r = form( nx ) .. s j = false k = i end end elseif not j then j = i if c >= 880 and c <= 1023 then -- single greek letter? m = i + 1 else m = false end end elseif m then m = m + 1 end end -- for i if j and ( not m or m < n ) then r = form( n ) else r = r .. mw.ustring.sub( adjust, k ) end end return r end -- Text.uprightNonlatin() Text.test = function ( about ) local r if about == "quote" then initQuoteData() r = { } r.QuoteLang = QuoteLang r.QuoteType = QuoteType end return r end -- Text.test() -- Export local p = { } for _, func in ipairs({'containsCJK','isLatinRange','isQuote','sentenceTerminated'}) do p[func] = function (frame) return Text[func]( frame.args[ 1 ] or "" ) and "1" or "" end end for _, func in ipairs({'getPlain','removeDiacritics','ucfirstAll','uprightNonlatin'}) do p[func] = function (frame) return Text[func]( frame.args[ 1 ] or "" ) end end function p.char( frame ) local params = frame:getParent().args local story = params[ 1 ] local codes, lenient, multiple if not story then params = frame.args story = params[ 1 ] end if story then local items = mw.text.split( mw.text.trim(story), "%s+" ) if #items > 0 then local j lenient = (yesNo(params.errors) == false) codes = { } multiple = tonumber( params[ "*" ] ) for _, v in ipairs( items ) do j = tonumber((v:sub( 1, 1 ) == "x" and "0" or "") .. v) table.insert( codes, j or v ) end end end return Text.char( codes, multiple, lenient ) end function p.concatParams( frame ) local args local template = frame.args.template if type( template ) == "string" then template = mw.text.trim( template ) template = ( template == "1" ) end if template then args = frame:getParent().args else args = frame.args end return Text.concatParams( args, frame.args.separator, frame.args.format ) end function p.listToFormat(frame) local lists = {} local pformat = frame.args["format"] local sep = frame.args["sep"] or ";" -- Parameter parsen: Listen for k, v in pairs(frame.args) do local knum = tonumber(k) if knum then lists[knum] = v end end -- Listen splitten local maxListLen = 0 for i = 1, #lists do lists[i] = mw.text.split(lists[i], sep) if #lists[i] > maxListLen then maxListLen = #lists[i] end end -- Ergebnisstring generieren local result = "" local result_line = "" for i = 1, maxListLen do result_line = pformat for j = 1, #lists do result_line = mw.ustring.gsub(result_line, "%%s", lists[j][i], 1) end result = result .. result_line end return result end function p.listToText( frame ) local args local template = frame.args.template if type( template ) == "string" then template = mw.text.trim( template ) template = ( template == "1" ) end if template then args = frame:getParent().args else args = frame.args end return Text.listToText( args, frame.args.format ) end function p.quote( frame ) local slang = frame.args[2] if type( slang ) == "string" then slang = mw.text.trim( slang ) if slang == "" then slang = false end end return Text.quote( frame.args[ 1 ] or "", slang, tonumber( frame.args[3] ) ) end function p.quoteUnquoted( frame ) local slang = frame.args[2] if type( slang ) == "string" then slang = mw.text.trim( slang ) if slang == "" then slang = false end end return Text.quoteUnquoted( frame.args[ 1 ] or "", slang, tonumber( frame.args[3] ) ) end function p.zip(frame) local lists = {} local seps = {} local defaultsep = frame.args["sep"] or "" local innersep = frame.args["isep"] or "" local outersep = frame.args["osep"] or "" -- Parameter parsen for k, v in pairs(frame.args) do local knum = tonumber(k) if knum then lists[knum] = v else if string.sub(k, 1, 3) == "sep" then local sepnum = tonumber(string.sub(k, 4)) if sepnum then seps[sepnum] = v end end end end -- sofern keine expliziten Separatoren angegeben sind, den Standardseparator verwenden for i = 1, math.max(#seps, #lists) do if not seps[i] then seps[i] = defaultsep end end -- Listen splitten local maxListLen = 0 for i = 1, #lists do lists[i] = mw.text.split(lists[i], seps[i]) if #lists[i] > maxListLen then maxListLen = #lists[i] end end local result = "" for i = 1, maxListLen do if i ~= 1 then result = result .. outersep end for j = 1, #lists do if j ~= 1 then result = result .. innersep end result = result .. (lists[j][i] or "") end end return result end function p.failsafe() return Text.serial end p.Text = function () return Text end -- p.Text return p 07f1fc4d39342fd92bdae1c5463bbfede7eeda1a Module:Text/doc 828 118 135 2023-10-08T06:02:20Z Silentg 2 Created page with "{{high use}} '''<code>Text</code>''' – Module containing methods for the manipulation of text, wikimarkup and some HTML. == {{Anchor|Vorlage}} Functions for templates == All methods have an unnamed parameter containing the text. The return value is an empty string if the parameter does not meet the conditions. When the condition is matched or some result is successfully found, strings of at least one character are returned. ; char {{Anchor|char}} : Creates a string..." wikitext text/x-wiki {{high use}} '''<code>Text</code>''' – Module containing methods for the manipulation of text, wikimarkup and some HTML. == {{Anchor|Vorlage}} Functions for templates == All methods have an unnamed parameter containing the text. The return value is an empty string if the parameter does not meet the conditions. When the condition is matched or some result is successfully found, strings of at least one character are returned. ; char {{Anchor|char}} : Creates a string from a list of character codes. ::; 1 ::: Space-separated list of character codes ::; * ::: Number of repetitions of the list in parameter '''1'''; (Default 1). ::; errors ::: <code>0</code> – Silence errors ; concatParams {{Anchor|concatParams}} : Combine any number of elements into a list, like <code>table.concat()</code> in Lua. : From a template: ::; 1 ::: First element; missing and empty elements are ignored. ::; 2 3 4 5 6 … ::: Further list elements : From Lua ::; args ::: ''table (sequence)'' of the elements ::; apply ::: Separator between elements; defaults to <code>|</code> ::; adapt ::: optional formatting, which will be applied to each element; must contain <code>%s</code>. ; containsCJK {{Anchor|containsCJK}} : Returns whether the input string contains any [[CJK characters]] :* Returns nothing if there are no CJK characters ; removeDelimited : Remove all text between delimiters, including the delimiters themselves. ; getPlain{{Anchor|getPlain}} : Remove wikimarkup (except templates): comments, tags, bold, italic, nbsp ; isLatinRange {{Anchor|isLatinRange}} : Returns some content, unless the string contains a character that would not normally be found in Latin text. :* Returns nothing if there is a non-Latin string. ; isQuote {{Anchor|isQuote}} : Returns some content if the parameter passed is a single character, and that character is a quote, such as <code>'</code>. :* Returns nothing for multiple characters, or if the character passed is not a quote. ; listToText {{Anchor|listToText}} : Formats list elements analogously to [[:mw:Extension:Scribunto/Lua_reference_manual#mw.text.listToText|mw.text.listToText()]]. : The elements are separated by a comma and space ; the word "and" appears between the first and last. : Unnamed parameters become the list items. : Optional parameters for <code>#invoke</code>: :* <code>format</code> – Every list element will first be formatted with this format string; see [[:mw:Extension:Scribunto/Lua_reference_manual#string.format|here]] for how to construct this string. The string must contain at least one <code>%s</code> sequence. :* <code>template=1</code> – List elements should be taken from the calling template. : Returns the resulting string. ; quote {{Anchor|quote}} : Wrap the string in quotes; quotes can be chosen for a specific language. ::; 1 ::: Input text (will be automatically trimmed); may be empty. ::; 2 ::: ''(optional)'' the [[ISO 639]] language code for the quote marks; should be one of the [[:de:Wikipedia:Lua/Modul/Text/Test#Anführungszeichen|supported languages]] {{in lang|de}} ::; 3 ::: ''(optional)'' <code>2</code> for second level quotes. This means the single quote marks in a statement such as: Jack said, “Jill said ‘fish’ last Tuesday.” ; quoteUnquoted {{Anchor|quoteUnquoted}} : : Wrap the string in quotes; quotes can be chosen for a specific language. Will not quote an empty string, and will not quote if there is a quote at the start or end of the (trimmed) string. ::; 1 ::: Input text (will be automatically trimmed); may be empty. ::; 2 ::: ''(optional)'' the [[ISO 639]] language code for the quote marks; should be one of the [[:de:Wikipedia:Lua/Modul/Text/Test#Anführungszeichen|supported languages]] {{in lang|de}} ::; 3 ::: ''(optional)'' <code>2</code> for second level quotes. This means the single quote marks in a statement such as: Jack said, “Jill said ‘fish’ last Tuesday.” ; removeDiacritics {{Anchor|removeDiacritics}} : Removes all [[diacritical marks]] from the input. ::; 1 ::;: Input text ; sentenceTerminated {{Anchor|sentenceTerminated}} : Is this sentence terminated? Should work with CJK, and allows quotation marks to follow. :* Returns nothing if the sentence is unterminated. ; ucfirstAll {{Anchor|ucfirstAll}} : The first letter of every recognized word is converted to upper case. This contrasts with the parser function {{tlg|:mw:ucfirst|alttext=ucfirst:}} which changes only the first character of the whole string passed. : A few common HTML entities are protected; the implementation of this may mean that numerical entities passed (e.g. <code>&amp;#38;)</code> are converted to <code>&amp;amp;</code> form ; uprightNonlatin {{Anchor|uprightNonlatin}} : Takes a string. Italicized non-Latin characters are un-italicized, unless they are a single Greek letter. ; zip {{Anchor|zip}} : Combines a tuple of lists by [[convolution (computer science)|convolution]]. This is easiest to explain by example: given two lists, list1 = "a b c" and list2 = "1 2 3", then<br><code>zip(liste1, liste2, sep = " ", isep = "-", osep = "/")</code><br>outputs<br><code>a-1/b-2/c-3</code> :* 1, 2, 3, … – Lists to be combined :* <code>sep</code> – A separator (in Lua [[regex]] form) used to split the lists. If empty, the lists are split into individual characters. :* <code>sep1</code>, <code>sep2</code>, <code>sep3</code>, … – Allows a different separator to be used for each list. :* <code>isep</code> – Output separator; placed between elements which were at the ''same'' index in their lists. :* <code>osep</code> – Output separator; placed between elements which had ''different'' original indices; i.e. between the groups joined with <code>isep</code> === Examples and test page === There are [[:de:Wikipedia:Lua/Modul/Text/Test|tests available]] {{in lang|de}} to illustrate this in practice. == {{Anchor|Lua}} Use in another Lua module == All of the above functions can be called from other Lua modules. Use <code>require()</code>; the below code checks for errors loading it: <syntaxhighlight lang="lua"> local lucky, Text = pcall( require, "Module:Text" ) if type( Text ) == "table" then Text = Text.Text() else -- In the event of errors, Text is an error message. return "<span class=\"error\">" .. Text .. "</span>" end </syntaxhighlight> You may then call: * Text.char( apply, again, accept ) * Text.concatParams( args, separator, format ) * Text.containsCJK( s ) * Text.removeDelimited( s ) * Text.getPlain( s ) * Text.isLatinRange( s ) * Text.isQuote( c ) * Text.listToText( table, format ) * Text.quote( s, lang, mode ) * Text.quoteUnquoted( s, lang, mode ) * Text.removeDiacritics( s ) * Text.sentenceTerminated( s ) * Text.ucfirstAll( s ) * Text.uprightNonlatin( s ) * <s>Text.zip(…)</s> * ''Text.test( s )'' == Usage == This is a general library; use it anywhere. == Dependencies == None. == See also == {{String-handling templates}} <includeonly>{{Sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Modules that manipulate strings]] }}</includeonly> 3a499e88041508f8c831c2343f30f9cad14008b0 Template:High use 10 119 136 2023-10-08T06:03:15Z Silentg 2 Redirected page to [[Template:High-use]] wikitext text/x-wiki #Redirect [[Template:High-use]] {{Redirect category shell|{{R from modification}}{{R from template shortcut}}}} 65ce33c8f2d9659b46256ceb1f7fe57859f66fb2 Template:Redirect category shell 10 120 137 2023-10-08T06:04:24Z Silentg 2 Created page with "__NONEWSECTIONLINK__{{Mbox | name = Redirect category shell | type = move | image = none | style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em; | textstyle = padding-top: 0.9em; padding-bottom: 0.9em; | text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}} |:: ''{{{h}}}''..." wikitext text/x-wiki __NONEWSECTIONLINK__{{Mbox | name = Redirect category shell | type = move | image = none | style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em; | textstyle = padding-top: 0.9em; padding-bottom: 0.9em; | text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}} |:: ''{{{h}}}'' }}<!-- Automatically detect protected redirects: --><includeonly>{{#switch: {{PROTECTIONLEVEL:move}} |sysop|templateeditor|extendedconfirmed={{pp-move|small=yes}} }}{{#switch: {{PROTECTIONLEVEL:edit}} |sysop={{R protected|embed=yes}} |templateeditor={{pp-protected|small=yes}}{{R template protected|embed=yes}} |extendedconfirmed={{pp-protected|small=yes}}{{R extended-protected|embed=yes}} |autoconfirmed={{pp-protected|small=yes}}{{R semi-protected|embed=yes}} | <!--Not protected, or only semi-move-protected--> }}</includeonly>{{#if: {{{1|}}}||<includeonly> * {{red|'''Important – Please Read! {{maroon|This template should {{em|not}} be applied without parameters by bot nor by any automated or semi-automated process. It should {{em|not}} be used without parameters {{em|unless you want to learn how to categorize redirects}}. For editors who want to learn how to categorize redirects, this template is a {{em|learning tool}}. {{em|Only}} those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter!}}'''}}</includeonly> * '''Manifold sort''': If help is needed to determine appropriate categories, then this redirect populates '''{{Cat|Miscellaneous redirects}}'''. Monitors of that category will check this redirect and add or remove [[Wikipedia:Categorizing redirects|rcats]] as needed.{{#ifeq: {{lc:{{{nocat|false}}}}} | false |{{{category|<includeonly>[[Category:Miscellaneous redirects]]</includeonly>}}}}} }} {{#if: {{{2|}}}|{{{2}}}|{{{1|}}}}}{{#if: {{{1|}}}{{{2|}}}||{{#ifeq: {{ROOTPAGENAME}}|Redirect category shell||[[Category:Redirect category shell without parameters]]}}}} ''<small>When appropriate, [[Wikipedia:Protection policy|protection levels]] are automatically sensed, described and categorized.</small>'' }}<noinclude> {{Documentation}} </noinclude> 554b3ada8f7ca8c0e840ea18a0344d3e94d13c38 Template:Redirect category shell/doc 10 121 138 2023-10-08T06:05:07Z Silentg 2 Created page with "{{documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{hatnote|This template supplements the redirect categorization done by adding rcats individually to redirects and by past usage of the now deprecated {{tl|This is a redirect}} template. Its creation and usage is the direct result of [[Template talk:This is a redirect|discussion]]s about the benefits and the shortc..." wikitext text/x-wiki {{documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{hatnote|This template supplements the redirect categorization done by adding rcats individually to redirects and by past usage of the now deprecated {{tl|This is a redirect}} template. Its creation and usage is the direct result of [[Template talk:This is a redirect|discussion]]s about the benefits and the shortcomings of the ''This is a redirect'' template.}} {{High-use}} {{mbox|image=none|text=[[File:Ambox warning pn.svg|20px|alt=red-outlined triangle containing exclamation point]] {{red|'''Important – please read! {{maroon|This template should ''not'' be used by a bot nor by any automated or semi-automated process without the use of parameters. It should ''not'' be used without parameters ''unless the redirect is manually categorized''. This template may be used as a ''learning tool'' to assist editors who wish to learn how to categorize redirects. ''Only'' those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter.}}'''}} <small>([[#When used alone|more below]])</small>}} {{Substitution|not|nor should this template and most redirect category (rcat) templates be used to tag [[Wikipedia:Soft redirects|soft redirects]]. Two exceptions are ''{{tl|Soft redirect with Wikidata item}}'', which can be used on all soft redirects, and ''{{tl|R category with possibilities}}'', which can only be used on soft redirects in the category namespace}} {{#ifeq:{{SUBPAGENAME}}|sandbox|{{Template redirect|Rcat shell/sandbox}}|{{template redirect|Redirect shell|R cat shell|Rcat shell|RCAT shell}}{{Template shortcut|redr|rcatsh}}}} This template is similar to {{tl|WikiProject banner shell}} in that it may be used to add one or more appropriate redirect category ([[WP:RCAT|rcat]]) templates, along with their parameters, to redirects. Additionally, this template ''automatically'' senses, describes, categorizes and changes [[WP:PP|protection levels]] when appropriate. A third important function is to help editors learn more about redirect categorization by use of the {{c|Miscellaneous redirects|manifold sort}}. For more information see the page below and the [[WP:TMR|main rcat '''index''']]. __TOC__ ==Purpose== As with the ''This is a redirect'' template, this template is based on a [[Wikipedia talk:WikiProject Redirect/Archive 1#New meta-template(s) idea|proposal]] to standardize [[wp:redirect templates|redirect templates]] (rcats). Its basic purpose is to simplify the process of tagging and categorizing redirects. Like the ''This is a redirect'' template, this shell template is also able to help newer contributors learn the redirect category system. Details of this part of the purpose of this shell template may be found in the [[#When used alone|When used alone]] section below. Protection levels are automatically detected by this template by use of {{tl|pp-protected}} and {{tl|pp-move}}. When edit protection or move protection (or both) is applied to a redirect that has been tagged with this template, the protection level is automatically detected, and the redirect will be tagged with a protection rcat and sorted to the appropriate protection-related category(ies). When protection is altered or removed, then the protection-related rcats and category(ies) will also be (automatically) changed or removed from the redirect. This template can categorize and display the text (with parameters) of any number of rcats that are needed (usually from one to seven).<br /> <ref name="mbox" group="Mbox note">When the wiki markup of this template is opened, it is seen that this is an "mbox-based" template. "Mbox" stands for "multi namespace message box", which is a meta-[[Help:A quick guide to templates|template]] that works in all namespaces. There can be a problem with this mbox unless editors are careful to place ''Redirect category shell'' '''on its own line at the ''very beginning of the line'''''. If this is done then all is well; if this is not done, then [[HTML Tidy]] may interfere with the mbox and cause this template to appear in an abnormal and unexpected manner when saved. So be careful where you leave this template placed in a redirect's Edit screen, take another look at the above [[#goodread|readability guide]], and be sure to preview your edits – all your edits. : '''{{green|Correct:}}''' <syntaxhighlight lang="wikitext"> #REDIRECT [[(target page)]] {{Redirect category shell|| {{R unprintworthy}} }} </syntaxhighlight> : '''{{red|''Not'' correct:}}''' <syntaxhighlight lang="wikitext"> #REDIRECT [[(target page)]] {{Redirect category shell||{{R unprintworthy}}}} </syntaxhighlight> : ''A blank line is usually placed between the redirect target and this template to make the "Edit" screen easier to read.''</ref> <ref name="printworthiness" group="Printworthiness note">Where the [[WP:printworthiness|printworthiness]] of a [[WP:mainspace|mainspace]] redirect is concerned, there are three kinds of [[WP:RCAT|rcat]]s: # those that populate the {{c|Printworthy redirects}} category by default, # those that populate the {{c|Unprintworthy redirects}} category by default, and # those that do not default to either of the above, and which leave it to the editor to decide based upon best knowledge whether or not a mainspace redirect is suitable for a printed or DVD version of ''Wikipedia''. At present, those that are types 1 and 2 will populate the appropriate printworthiness category, however the notice will not appear within the mbox of this template unless either {{tl|R printworthy}} or {{tl|R unprintworthy}} is listed as an rcat within this template. For example, if a redirect is tagged with: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from ambiguous term}} }} </syntaxhighlight> ...then the hidden categories populated will be {{c|Redirects from ambiguous pages}}, {{c|Unprintworthy redirects}} and any appropriate protection categories. These will appear at the bottom of the redirect page only to registered users who are logged in and who have set their preferences to see hidden categories. The mbox that will appear to all readers would look like: {{Redirect category shell| {{R from ambiguous term/demo|embed=yes}} }} To show the printability or printworthiness information in the mbox, then the redirect must be tagged with either the printworthy or unprintworthy rcat as in the following example: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from ambiguous term}} {{R unprintworthy}} }} </syntaxhighlight> ...which produces: {{Redirect category shell| {{R from ambiguous term/demo|embed=yes}} {{R unprintworthy|embed=yes}} }} '''''Only then''' will the printability, ''printworthy'' or ''unprintworthy'', be described within this template's mbox on the redirect page.''</ref> ==Usage== Used by itself with no parameters, for example, {{tlc|Redirect category shell}} (and its alias {{tlc|Rcat shell}}), the template will appear as it does at the top of this page, and the redirect will populate {{Cat|Miscellaneous redirects}}. That category will also be populated if the first parameter is left empty while rcats occupy the second parameter. This is useful when an editor adds rcats and yet feels unsure that there may be at least one other rcat with category that may be used to tag the redirect. Monitors of the ''Miscellaneous redirects'' category will then help decide if another rcat(s) is needed. Then the empty first parameter may be excluded by removing either the first or second pipe. That will remove the redirect from ''Category:Miscellaneous redirects''. [[#When used alone|See below]] for more information. This template may hold any number of different redirect category ([[WP:RCAT|rcat]]) templates, usually from one to seven. The choices for editors are listed at [[Wikipedia:Template index/Redirect pages]] both alphabetically and by function. Any of those rcats may be used either with their full template name, e.g., '''R from alternative language''', or with an alias (shortcut redirect), which may be found in each rcat's [[WP:TDOC|documentation]]. An unnamed parameter, {{para|1}}, has been introduced in this template and works as follows: <syntaxhighlight lang="wikitext"> {{Redirect category shell|1= {{rcat 1}} {{rcat 2}} {{rcat 3}} {{rcat N}} }} </syntaxhighlight> : ''or'' the {{code|1{{=}}}} may be omitted: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{rcat 1}} {{rcat 2}} {{rcat 3}} {{rcat N}} }} </syntaxhighlight> As with all templates that have unnamed (numbered) parameters, the numbers and equal signs may be omitted. "N" represents the highest number of rcats that can be used in this template, and at this point the only limit would be any wiki markup ceiling that may exist. Usually, from one to seven rcats suffice; however, more rcats can be used if required. The actual sequence of rcats is left to editors – there is no priority as to which rcat should be "first" and which rcats should "follow" in any particular order. A second unnamed parameter, {{para|2}}, has also been introduced. This gives this template the same "help" functionality that is used in the ''This is a redirect'' template. If the first parameter is left "empty", then {{cat|Miscellaneous redirects}} will be populated: <syntaxhighlight lang="wikitext"> {{Redirect category shell|1=|2= {{rcat 1}} {{rcat 2}} {{rcat N}} }} </syntaxhighlight> :''or'' if a second pipe is placed directly after the first pipe, then that will accomplish the same manifold sort: <syntaxhighlight lang="wikitext"> {{Redirect category shell|| {{rcat 1}} {{rcat 2}} {{rcat N}} }} </syntaxhighlight> Note the double pipe after the word "shell" above, which indicates an empty first parameter. Editors who monitor the ''Miscellaneous redirects'' category will come to the redirect and check, add or remove rcats as needed. Also, when used by itself this template will appear as it does at the top of this page and populate the ''Miscellaneous redirects'' category: <syntaxhighlight lang="wikitext"> {{Redirect category shell}} </syntaxhighlight> {{anchor|goodread}} This template may be added to a redirect page in the following manner: <syntaxhighlight lang="wikitext"> #REDIRECT [[(target page name)]] {{Redirect category shell|| {{R from short name}} {{R unprintworthy}} }} </syntaxhighlight> : It can be noted here that the rcats can also go on the same line as the ''Redirect category shell'' template: <syntaxhighlight lang="wikitext"> #REDIRECT [[(target page name)]] {{Redirect category shell||{{R from short name}}{{R unprintworthy}}}} </syntaxhighlight> : Again, note the double pipe after "shell" above, which indicates an empty first parameter. Leave the first parameter empty to sort a redirect to {{cat|Miscellaneous redirects}} ''in addition to'' the categories of the rcats that are used. In this case the {{c|Redirects from short names}} and {{c|Unprintworthy redirects}} categories will also be populated. Monitors of the "Miscellaneous redirects" category will help editors when needed. Generally for good readability on the edit screen, this template is placed beginning on the third line of that screen as follows: <syntaxhighlight lang="wikitext"> Line 1: #REDIRECT [[(target page name)]] </syntaxhighlight> Line 2: {{red|<small>(please leave this line blank for emphasis and ease of reading by editors)</small>}} <syntaxhighlight lang="wikitext"> Line 3: {{Redirect category shell|{{R from move}}{{R to section}}{{R printworthy}}}} </syntaxhighlight> : ''See also: section titled '''[[#Mbox-based|Mbox note]]''' below.'' === Parameters === In addition to the unnamed {{para|1}} and {{para|2}} parameters, there is a "hatnote" parameter, {{para|h}}, which provides an italicized TOP note when needed. For example: <syntaxhighlight lang="wikitext"> {{Redirect category shell|h=This code has not been confirmed as an [[International Air Transport Association airport code|IATA]] airport code.| {{R from airport code}} }} </syntaxhighlight> ...uses the rcat {{tl|R from airport code}} and produces:<!-- Note: An Mbox is used below rather than the template to illustrate the error box, which only appears on redirect pages. --> {{Mbox | name = This is a redirect/rcat | type = move | image = none | style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em; | textstyle = padding-top: 0.9em; padding-bottom: 0.9em; | text = [[File:Symbol redirect arrow with gradient.svg|25px|link=]] '''This page is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>''' :: ''This code has not been confirmed as an [[International Air Transport Association airport code|IATA]] airport code.'' * {{R from airport code|embed=yes}} {{Ombox|type=content|image=[[File:Stop hand orange.svg|50px]]|text={{Error|The above [[WP:RCAT|rcat]] should only be used to categorize redirects that are in the ''[[WP:main|main]]'' namespace.}}}} ''<small>When appropriate, [[WP:PP|protection levels]] are automatically sensed, described and categorized.</small>'' }} :''An error box appears that illustrates what happens if an editor uses an rcat in the wrong namespace. Correct namespaces are found on individual rcat documentation pages. In addition to the error box, the redirect '''''will not''''' be sorted to the rcat's category; instead it will populate '''''{{cat|Pages with templates in the wrong namespace}}!''' ''If an error box appears when an edit is '''previewed''', then appropriate changes can be made ''before'' the redirect page is actually '''saved'''.'' :''Also, note the pipe symbol ''(|)'' that follows the text in the {{para|h}} parameter. If this pipe is omitted, very unusual results will be seen when your edit is previewed or saved. Be sure to include that pipe at the very end of the text if the {{para|h}} parameter is used to form a hatnote.'' ==== Rcat parameters ==== In addition to this template's ability to act as a shell template for rcats, it accepts all of the parameters that rcats accept. Rcat parameters, when needed, will work in this template as follows: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from plural|printworthy}} }} </syntaxhighlight> This subdues the {{c|Unprintworthy redirects}} category to which {{tl|R from plural}} defaults and populates the {{c|Printworthy redirects}} category instead. The position an rcat holds will have no effect on the parameters of other rcats that are used to tag a redirect: <syntaxhighlight lang="wikitext" style="font-size:95%;overflow:auto;"> {{Redirect category shell| {{R from move}} {{R from modification}} {{R from alternative name}} {{R from alternative language|en|es}} {{R for convenience}} {{R from plural|printworthy}} {{R printworthy}} }} </syntaxhighlight> In the above example, {{tl|R from plural}} is the sixth rcat, and its first parameter is used to change from "unprintworthy" to "printworthy". {{tl|R from alternative language}}) holds the 4th position, and its first parameter is used to house the [[Wikipedia:Template messages/Redirect language codes|ISO 639 language code]] of the source language, in this case '''<code>{{nbsp}}en{{nbsp}}</code>''' for [[English language|English]]. Its second parameter houses the language code for the targeted page, in this case '''<code>{{nbsp}}es{{nbsp}}</code>''' for the [[Spanish language]]. It does not matter if the relative position of these rcats changes for any reason, their individual parameters will continue to be effective. If more rcat parameters are used, then they work the same way. For example, if a redirect exists that is a misspelling of a title, it can be tagged with {{tl|R from misspelling}} in the following manner: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from misspelling|(correct spelling if needed)|printworthy}} {{R printworthy}} }} </syntaxhighlight> In this case, the rcat's ''{{para|1}}'' parameter is the correct spelling (used only if the target of the redirect is '''not''' the correct spelling). The rcat's ''{{para|2}}'' parameter can be used to change from the default "unprintworthy" categorization. Some misspellings may be helpful in a printed version of ''Wikipedia'', so the second parameter in ''R from misspelling'' above is used to subdue its default "unprintworthy" category sort, and the redirect will populate {{cat|Printworthy redirects}} instead. In this shell template, the order of the rcats will not affect the rcats' parameters. If an editor checks the page history and finds that the above redirect is also the result of a page move and inserts {{tl|R from move}} at the top of the order: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from move}} {{R from misspelling|(correct spelling)|printworthy}} {{R printworthy}} }} </syntaxhighlight> ...the parameters of the ''R from misspelling'' rcat template will not be affected, as they may be when used in the ''This is a redirect'' template. An example of a "printworthy misspelling" can be found at template {{tl|R from misspelling}}. '''Another example:''' <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from alternative language|ja|es}} {{R unprintworthy}} }} </syntaxhighlight> The above code will sort the redirect into three categories: * {{c|Redirects from Japanese-language terms}} ({{para|1|ja}}), * {{c|Redirects to Spanish-language terms}} ({{para|2|es}}) and * {{c|Unprintworthy redirects}} ''See the lists of [[List of ISO 639-1 codes|ISO 639-1]] and [[List of ISO 639-2 codes|ISO 639-2]] codes for two- and three-letter language codes that can be used this way. See also [[Wikipedia:Template messages/Redirect language codes]] for common codes that are already used on redirects.'' === When used alone === This template is designed to help contributors who are unfamiliar with categorizing redirects by enabling them to sort redirects into the monitored {{c|Miscellaneous redirects}} category. Do not hesitate to use this important function to help with sorting redirects to correct and appropriate categories. There are two ways to sort a redirect into the ''Miscellaneous redirects category''. When this template is used without any rcats, it will perform the miscellaneous sort: {{tlx|Redirect category shell}}... {{Redirect category shell|nocat=true}} Also, if one or more rcats are known, but an editor is unsure that there might be one or more ''other'' rcats that are needed, then leave the first parameter blank (type two pipes together → <code>||</code>): <syntaxhighlight lang="wikitext"> {{Redirect category shell|| {{R from subtopic}} {{R printworthy}} }} </syntaxhighlight> {{Redirect category shell|nocat=true|| {{R from subtopic|embed=yes}} {{R printworthy|embed=yes}} }} Monitors of the ''Miscellaneous redirects'' category will check the redirect, add other rcats if needed and then remove the empty first parameter. ==Comparison== [[Template:Redirect category shell/Comparison]] shows the difference in the appearance of text between when individual rcats are used and when this template is used. ==Other templates== This template may also carry and hold other templates within it. Even the {{tl|DEFAULTSORT}} magic word and a [[WP:sort key|sort key]] may be used either inside this template or below it. Another template commonly used within the ''Redirect category shell'' template is {{tl|Italic title}} and its shortcut to format titles in italics. Some rcats such as {{tl|R from book}} and {{tl|R from film}} automatically format the redirect names in italics. Any appropriate template may be used within this shell template in the following manner: <syntaxhighlight lang="wikitext"> {{Redirect category shell| {{R from move}} {{R from alternative name}} {{Italic title}} {{DEFAULTSORT:Hobbit, The}} }} </syntaxhighlight> ==Notes== {{anchor|Mbox-based}} '''Mbox note''' {{Reflist|group="Mbox note"}} '''Printworthiness note''' {{See also|Wikipedia:Printability}} {{Reflist|group="Printworthiness note"}} ==See also== * {{tl|Talk page of a redirect}}, to "[[WP:SRD|soft]]" redirect a [[WP:subject page|subject page]]'s talk page that has already been created '''''and given content''''' (project banners, deletion/merge notices, discussions) * [[Wikipedia:Protection policy]], for questions related to this template's ability to detect protection levels * [[Wikipedia:Template index/Redirect pages]], a functional and an alphabetical index of rcats * [[Wikipedia:WikiProject Redirect/Style guide|WikiProject Redirect/Style guide]] ==Tracking categories== * {{clc|Redirect category shell without parameters}} ==TemplateData== {{TemplateData header}} <templatedata> { "params": { "1": { "label": "Redirect categories", "description": "1 or more redirect category templates.", "example": "{{R from alternative name}}", "type": "content", "suggested": true }, "2": { "label": "Redirect categories (more needed)", "description": "Same as Redirect categories, except that the redirect is also added to Category:Miscellaneous redirects.", "type": "content" }, "h": { "label": "Hatnote", "description": "A hatnote to display above the redirect categories.", "type": "line" }, "nocat": { "label": "No category", "description": "Don't add this redirect to Category:Miscellaneous redirects, even if Redirect categories has been left empty.", "type": "boolean" }, "category": { "label": "Category", "description": "The category to add this redirect to if the Redirect categories parameter is empty. Defaults to Category:Miscellaneous redirects.", "example": "[[Category:Miscellaneous redirects]]", "type": "line" } }, "description": "This template may be used to add one or more appropriate redirect category (rcat) templates, along with their parameters, to redirects. Additionally, this template automatically senses, describes, categorizes and changes protection levels when appropriate.", "paramOrder": [ "1", "2", "h", "nocat", "category" ] } </templatedata> {{R template index}} <includeonly>{{sandbox other|| <!-- Categories go below this line, please; interwikis go to Wikidata, thank you! --> [[Category:WikiProject Redirect templates|Redirect category shell]] [[Category:Redirect templates| ]] [[Category:Template shell templates]] }}</includeonly> 80ef79af880a2b8a82210513173bbda8e8bad17f Template:Nobold 10 122 139 2023-10-08T06:06:45Z Silentg 2 Created page with "<templatestyles src="Nobold/styles.css"/><span class="nobold">{{{1}}}</span><noinclude> {{documentation}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --> </noinclude>" wikitext text/x-wiki <templatestyles src="Nobold/styles.css"/><span class="nobold">{{{1}}}</span><noinclude> {{documentation}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --> </noinclude> 9c92b5951772bb26ca0fbe9256418b65e47700dd Template:Nobold/doc 10 123 140 2023-10-08T06:07:07Z Silentg 2 Created page with "<noinclude>{{documentation subpage}}</noinclude> {{COinS safe|n}} {{High-risk|155,000+}} {{Uses TemplateStyles|Template:Nobold/styles.css}} : <code><nowiki>{{nobold|</nowiki>''text-string''}}</code> To display text (''text-string'') at normal font-weight within a context where the default font-weight is '''bold''', e.g. header cells in tables. ==TemplateData== {{TemplateData header}} <templatedata> { "params": { "1": { "label": "Input text", "description": "Tex..." wikitext text/x-wiki <noinclude>{{documentation subpage}}</noinclude> {{COinS safe|n}} {{High-risk|155,000+}} {{Uses TemplateStyles|Template:Nobold/styles.css}} : <code><nowiki>{{nobold|</nowiki>''text-string''}}</code> To display text (''text-string'') at normal font-weight within a context where the default font-weight is '''bold''', e.g. header cells in tables. ==TemplateData== {{TemplateData header}} <templatedata> { "params": { "1": { "label": "Input text", "description": "Text to present not bolded", "type": "string", "required": true } }, "format": "inline" } </templatedata> ==See also== * [[Template:No selflink]] (prevents selflinks from bolding, something this template does not do) * [[Template:Noitalic]] * [[Template:Nocaps]] <includeonly>{{Sandbox other|| <!--Categories--> [[Category:Text-specific formatting and function templates|{{PAGENAME}}]] }}</includeonly> de0aca7a93c6c5343702ea4d971bd69e3ec49793 Template:Nobold/styles.css 10 124 141 2023-10-08T06:07:44Z Silentg 2 Created page with "/* {{pp-template}} */ /* Styling for Template:Nobold */ .nobold { font-weight: normal; }" sanitized-css text/css /* {{pp-template}} */ /* Styling for Template:Nobold */ .nobold { font-weight: normal; } 83e5f0adacf8c7984251f1fd9d11ed82ebaadf03 Template:Template other 10 125 142 2023-10-08T06:09:00Z Silentg 2 Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude>" wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{ns:Template}} | template | other }} }} | template = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} <!-- Add categories and interwikis to the /doc subpage, not here! --> </noinclude> 06fb13d264df967b5232141067eb7d2b67372d76 Template:Template other/doc 10 126 143 2023-10-08T06:09:18Z Silentg 2 Created page with "{{Documentation subpage}} {{Template shortcut|ns10}} {{High-risk|2=yes|all-pages=yes}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This is a meta-template which helps other templates detect whether they are used in the "Template:" namespace. ==Usage== This template usually takes one or two parameters: : {{tc|Template other&nbsp;|''[result/action if on a template page]''&#32;(|''[res..." wikitext text/x-wiki {{Documentation subpage}} {{Template shortcut|ns10}} {{High-risk|2=yes|all-pages=yes}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> This is a meta-template which helps other templates detect whether they are used in the "Template:" namespace. ==Usage== This template usually takes one or two parameters: : {{tc|Template other&nbsp;|''[result/action if on a template page]''&#32;(|''[result/action if on another type of page]'')}} For example, if {{tlf|Template other&#32;|On template page&#32;|Not on template page}} were on a "Template:" page, it would return: : {{Template other |On template page |Not on template page}} On any other type of page (e.g. "Wikipedia:", "User:") it would return: : {{Template other|demospace=other |On template page |Not on template page}} A typical use is to manage the categorization of template pages. Adding {{tlf|Template other&nbsp;|&#32;|{{!((}}Category:''[category name]''{{))!}}}} to a template, for instance, means it would only categorize a page when that page isn't a template page. (The first parameter consists of nothing, so no action taken if/when the template is on a template page.) ==Demospace== The parameter {{mono|demospace}} can be used to demonstrate or test this template. By default, it is undefined and has no effect on the template's action, but: * when set as "template" ({{para|demospace|template}}), it prompts the template to return the ''first'' result/action above (i.e. to behave as if on a "Template:" page) even if the template is on a different type of page; * when set as "other" ({{para|demospace|other}}), it prompts the template to return the ''second'' result/action above (i.e. to behave as if not on a "Template:" page) even if the template is on a "Template:" page. For example: <syntaxhighlight lang="wikitext"> {{Template other | demospace = template | Template page text | Other pages text }} </syntaxhighlight> No matter on what kind of page the code above is used, it returns: {{Template other | demospace = template | Template page text | Other pages text }} You can make it so your template also understands the '''demospace''' parameter. That means you can demonstrate the different appearances of your template in the documentation for your template. Then do like this: <syntaxhighlight lang="wikitext"> {{template other | Template page text | Other pages text | demospace = {{{demospace|}}} }} </syntaxhighlight> ==Technical details== This template detects "Template talk:" pages as type '''other'''. For more details relevant to this template, see {{tl|Main talk other}}, which works similarly. {{Namespace and pagename-detecting templates}} <includeonly>{{sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Namespace manipulation templates]] [[Category:Template namespace templates]] }}</includeonly> f38c4cdbcd335644503bcaf560fab37b9e4f97b2 Template:Tlf 10 127 144 2023-10-08T06:12:11Z Silentg 2 Redirected page to [[Template:Template link with link off]] wikitext text/x-wiki #REDIRECT [[Template:Template link with link off]] {{Redirect category shell| {{R from move}} }} 52759e1d3f7c9aa4a03d0b7d4f84f4c6adf53edf Template:Template link with link off 10 128 145 2023-10-08T06:12:57Z Silentg 2 Created page with "<includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude> {{Documentation|1=Template:Tlg/doc |content = {{tlg/doc|tlf}} }} <!-- Add categories to the /doc subpage, not here! --> </noinclude>" wikitext text/x-wiki <includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude> {{Documentation|1=Template:Tlg/doc |content = {{tlg/doc|tlf}} }} <!-- Add categories to the /doc subpage, not here! --> </noinclude> b099fea5d1f36b0b4b9cb253ad3a9f4e095f6851 Module:Infobox/doc 828 129 146 2023-10-08T07:13:32Z Silentg 2 Created page with "{{High-use|3308957|all-pages = yes}} {{module rating|protected}} {{Lua|Module:Navbar|Module:Italic title}} {{Uses TemplateStyles|Module:Infobox/styles.css|Template:Hlist/styles.css|Template:Plainlist/styles.css}} '''Module:Infobox''' is a [[WP:Module|module]] that implements the {{tl|Infobox}} template. Please see the template page for usage instructions. == Tracking categories == * {{clc|Pages using infobox templates with ignored data cells}} * {{clc|Articles using in..." wikitext text/x-wiki {{High-use|3308957|all-pages = yes}} {{module rating|protected}} {{Lua|Module:Navbar|Module:Italic title}} {{Uses TemplateStyles|Module:Infobox/styles.css|Template:Hlist/styles.css|Template:Plainlist/styles.css}} '''Module:Infobox''' is a [[WP:Module|module]] that implements the {{tl|Infobox}} template. Please see the template page for usage instructions. == Tracking categories == * {{clc|Pages using infobox templates with ignored data cells}} * {{clc|Articles using infobox templates with no data rows}} * {{clc|Pages using embedded infobox templates with the title parameter}} <includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox|| [[Category:Modules that add a tracking category]] [[Category:Wikipedia infoboxes]] [[Category:Infobox modules]] [[Category:Modules that check for strip markers]] }}</includeonly> 936ad219eb263a6f3293d62f667bd7b5db1059c1 Template:Hlist 10 130 147 2023-10-08T07:15:07Z Silentg 2 Created page with "{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>" wikitext text/x-wiki {{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 9e3824c2e3c0e0dbef2f37556ac0b994987fecf9 Template:Hlist/doc 10 131 148 2023-10-08T07:15:30Z Silentg 2 Created page with "{{Documentation subpage}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{used in system|in [[MediaWiki:Citethispage-content]]}} {{Lua|Module:List}} {{Uses TemplateStyles|Template:Hlist/styles.css}} {{tlr|clear=right|Horizontal list|dotlist|hlist1}} This template creates [[WP:HLIST|horizontal lists]]. Each item in the list may be individually styled with [[CSS]]. __TOC__ {{-}} == Usage == '''Basic usage''' {{pre|<nowiki>{{</nowiki>hl..." wikitext text/x-wiki {{Documentation subpage}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{used in system|in [[MediaWiki:Citethispage-content]]}} {{Lua|Module:List}} {{Uses TemplateStyles|Template:Hlist/styles.css}} {{tlr|clear=right|Horizontal list|dotlist|hlist1}} This template creates [[WP:HLIST|horizontal lists]]. Each item in the list may be individually styled with [[CSS]]. __TOC__ {{-}} == Usage == '''Basic usage''' {{pre|<nowiki>{{</nowiki>hlist<nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>...<nowiki>}}</nowiki>}} '''All parameters''' {{pre| <nowiki>{{</nowiki>hlist <nowiki>|</nowiki>''first item''<nowiki>|</nowiki>''second item''<nowiki>|</nowiki>''third item''<nowiki>|</nowiki>... <nowiki>|class = </nowiki>''class for div tag'' <nowiki>|style = </nowiki>''style for div tag'' <nowiki>|list_style = </nowiki>''style for ul tag'' <nowiki>|item_style = </nowiki>''style for all li tags'' <nowiki>|item1_style = </nowiki>''style for first li tag'' <nowiki>|item2_style = </nowiki>''style for second li tag'' <nowiki>|</nowiki>... <nowiki>|indent = </nowiki>''the number of tabs to indent'' <nowiki>}}</nowiki> }} == Parameters == * Positional parameters (<code>1</code>, <code>2</code>, <code>3</code>...): these are the list items. If no list items are present, the module will output nothing. * <code>class</code>: a custom class for the {{tag|div}} tags surrounding the list. Set to <code>inline</code> when using {{tlf|hlist}} inside text. * <code>style</code>: a custom CSS style for the {{tag|div}} tags surrounding the list, e.g. <code>font-size: 90%;</code>. * <code>list_style</code>: a custom CSS style for the {{tag|ul}} tags around the list. The format is the same as for the {{para|style}} parameter. * <code>item_style</code>: a custom CSS style for all of the list items (the {{tag|li}} tags). The format is the same as for the {{para|style}} parameter. * <code>item1_style</code>, <code>item2_style</code>, <code>item3_style</code>...: custom CSS styles for each of the list items. The format is the same as for the {{para|style}} parameter. * <code>indent</code>: the number of tabs to indent the list. Default value is 0. == Examples == {{markup | <nowiki>{{hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}}</nowiki> | {{hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}} | <nowiki>Giant planets ({{hlist|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).</nowiki> | Giant planets ({{hlist|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}). | <nowiki>Giant planets ({{hlist|class=inline|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}).</nowiki> | Giant planets ({{hlist|class=inline|[[Jupiter|J]]|[[Saturn|S]]|[[Uranus|U]]|[[Neptune|N]]}}). | <nowiki>{{hlist|Winner|Runner-up|Third place|indent=2}}</nowiki> | {{hlist|Winner|Runner-up|Third place|indent=2}} | <nowiki>{{hlist|Winner|Runner-up|Third place|item_style=color:blue;}}</nowiki> | {{hlist|Winner|Runner-up|Third place|item_style=color:blue;}} | <nowiki>{{hlist|Winner|Runner-up|Third place|item1_style=background-color:yellow;|item2_style=background-color:silver;}}</nowiki> | {{hlist|Winner|Runner-up|Third place|item1_style=background-color:yellow;|item2_style=background-color:silver;}} }} == Avoiding Linter errors == {{tlf|hlist}} will produce [[Wikipedia:Linter|Linter]] [[Special:LintErrors/misc-tidy-replacement-issues|errors]] if placed inside a template that uses {{tag|span}} tags, such as {{tl|small}}, {{tl|larger}}, etc. To avoid this, use the substitutions from the table below: {| {{table}} ! Incorrect markup !! Correct markup |- | <code><nowiki>{{small|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:85%}}</nowiki></code> |- | <code><nowiki>{{resize|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:90%}}</nowiki></code> |- | <code><nowiki>{{midsize|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:92%}}</nowiki></code> |- | <code><nowiki>{{larger|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:110%}}</nowiki></code> |- | <code><nowiki>{{big|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:120%}}</nowiki></code> |- | <code><nowiki>{{large|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:large}}</nowiki></code> |- | <code><nowiki>{{huge|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:180%}}</nowiki></code> |- | <code><nowiki>{{resize|x%|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:x%}}</nowiki></code> |- | <code><nowiki>{{font|size=x%|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=font-size:x%}}</nowiki></code> |- | <code><nowiki>{{nowrap|{{hlist|...}}}}</nowiki></code> || <code><nowiki>{{hlist|...|style=white-space: nowrap}}</nowiki></code> |} {{navbox lists}} <includeonly>{{Sandbox other|| <!-- Categories go here, and interwikis go in Wikidata --> [[Category:List formatting and function templates]] }}</includeonly> 53a60ad328f2ec495bd209c2ef35941c2dff2323 Template:Plainlist 10 132 149 2023-10-08T07:17:40Z Silentg 2 Created page with "<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude>" wikitext text/x-wiki <templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}| {{{1}}} </div>}}<noinclude></div> {{documentation}} </noinclude> 582fe7098c25c1ecfc0ad32f62ecd674ebe2bdf0 Template:Plainlist/doc 10 133 150 2023-10-08T07:17:59Z Silentg 2 Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE --> {{High-use}} {{Template shortcut|PL}} {{Uses TemplateStyles|Template:Plainlist/styles.css}} This template provides a [[Web Content Accessibility Guidelines|WCAG]]/ISO-standards-compliant accessible alternative to <code><nowiki><br /></nowiki></code> separated lists, per [[WP:UBLIST]] and [[WP:PLIST]] == Usage == {{tl|plainlist}} starts a plain (i.e. unbulleted) list, such as: {{plainlis..." wikitext text/x-wiki {{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE --> {{High-use}} {{Template shortcut|PL}} {{Uses TemplateStyles|Template:Plainlist/styles.css}} This template provides a [[Web Content Accessibility Guidelines|WCAG]]/ISO-standards-compliant accessible alternative to <code><nowiki><br /></nowiki></code> separated lists, per [[WP:UBLIST]] and [[WP:PLIST]] == Usage == {{tl|plainlist}} starts a plain (i.e. unbulleted) list, such as: {{plainlist| * [[cat]] * [[dog]] * [[horse]] * [[cow]] * [[sheep]] * [[pig]] }} It uses proper HTML list markup, which is more standards-compliant and more accessible than separating list items with {{tag|br|s}}. Detailed reasons for using this template can be found at [[WP:UBLIST]]. This template can be used with or without {{tl|endplainlist}}. It is an alternative to {{tl|unbulleted list}}, which performs the same function in a more concise but less wiki-style manner. Note that {{tl|unbulleted list}} will work inside image captions, whereas {{tl|plainlist}} does not. == Examples == {{Markup |<nowiki> {{plainlist| * [[cat]] * [[dog]] * [[horse]] * [[cow]] * [[sheep]] * [[pig]] }} </nowiki> | {{plainlist| * [[cat]] * [[dog]] * [[horse]] * [[cow]] * [[sheep]] * [[pig]] }} }} === Alternative syntax === {{Markup |<nowiki> {{plainlist}} * [[cat]] * [[dog]] * [[horse]] * [[cow]] * [[sheep]] * [[pig]] {{endplainlist}} </nowiki> | {{plainlist}} * [[cat]] * [[dog]] * [[horse]] * [[cow]] * [[sheep]] * [[pig]] {{endplainlist}} }} == Parameters == {{Format TemplateData|JSON= { "params": { "1": { "label": "List content", "description": "If supplied, the list, as a normal bulleted list. (Every line should start with an asterisk. No blank lines between lines.) See template page for how this works otherwise.", "type": "content", "suggested": true }, "class": { "label": "CSS classes", "description": "Adds a CSS class to the containing div.", "type": "string", "default": "The class \"plainlist\" is always applied." }, "style": { "label": "Custom CSS", "description": "Adds CSS style options. Complex styles should not be used in articles (per [[WP:Deviations]]) but may be acceptable on user, project, and talk pages.", "type": "string", "example": "border:solid 1px silver; background:lightyellow" }, "indent": { "label": "Indent level", "description": "Indents the list by a number of standard indents (one indent being 1.6em), particularly handy for inclusion in an indented discussion thread.", "type": "number", "example": "2" } }, "description": "This template provides a WCAG/ISO-standards-compliant accessible alternative to &lt;br /&gt; separated lists, per [[WP:UBLIST]] and [[WP:PLIST]]. It uses proper HTML list markup, which is more standards-compliant and more accessible than separating list items with &lt;br /&gt;. Detailed reasons for using this template can be found at WP:UBLIST." } }} === Controlling line-breaking === Template {{tlx|nbsp}} may be used with {{tlx|wbr}} and {{tlx|nowrap}} to control line-breaking in bulletless lists, to prevent wrapped long entries from being confused with multiple entries. See [[Template:Wbr/doc#Controlling line-breaking in infoboxes]] for details. == Technical details == {{tl|Plainlist}} works by constructing a [[span and div|div]] with the [[Cascading Style Sheets|CSS]] class "plainlist" which has the styles listed in [[Template:Plainlist/styles.css]]. {| class="wikitable" ! Wikitext ! Expanded template ! HTML |- style="vertical-align:top;" | class="nowrap" | <pre> {{Plainlist| * Example 1 * Example 2 * Example 3 }} </pre> | class="nowrap" | {{nowiki2|tag=pre| {{Plainlist| * Example 1 * Example 2 * Example 3 }} }} | <syntaxhighlight lang="html"> <div class="plainlist"> <ul> <li>Example 1</li> <li>Example 2</li> <li>Example 3</li> </ul> </div> </syntaxhighlight> |} == Redirects == * {{tl|Startplainlist}} == See also == * {{tl|unbulleted list}} – essentially the same but uses <code><nowiki>| ... | ... | ...</nowiki></code> instead of <code><nowiki>|* ... * ... * ...</nowiki></code> * {{tl|flatlist}} and {{tl|hlist}} (replacements for comma- or dash-separated lists) * {{tl|bulleted list}} * {{tl|indented plainlist}} * {{tl|ordered list}} * {{section link|Template:Infobox person#Inline lists}} for more information on creating lists within the Infobox family of templates, with examples in the following {{section link|Template:Infobox person#Examples|nopage=y}} {{navbox lists}} <includeonly>{{Sandbox other|| <!-- CATEGORIES HERE, THANKS --> [[Category:List formatting and function templates|Plainlist]] [[Category:Semantic markup templates]] [[Category:Typing-aid templates|Plainlist]] }}</includeonly> 3e643450c27b6fb02ce218d36c67d391a6e20482 Template:Siderbar 10 134 151 2023-10-08T09:19:46Z Silentg 2 Created page with "{{#invoke:Sidebar|sidebar}}<noinclude> {{documentation}}</noinclude>" wikitext text/x-wiki {{#invoke:Sidebar|sidebar}}<noinclude> {{documentation}}</noinclude> ab2498000a99daf324f656b0badd187b4a3e2b42 Template:Siderbar/doc 10 135 152 2023-10-08T09:20:09Z Silentg 2 Created page with "{{Documentation subpage}} {{about|the vertical navigation template|the horizontal template|Template:Navbox|the left sidebar of the interface|mw:Manual:Interface/Sidebar{{!}}the article in the Mediawiki Manual}} {{#ifeq:{{FULLPAGENAME}}|Template:Sidebar|{{High-risk| approximately 145000 }}{{Template display|nomobile}}}} {{Lua|Module:Sidebar}} This template is a [[wikt:metatemplate|metatemplate]] for the creation of sidebar templates, i.e. boxes that are Vertical direct..." wikitext text/x-wiki {{Documentation subpage}} {{about|the vertical navigation template|the horizontal template|Template:Navbox|the left sidebar of the interface|mw:Manual:Interface/Sidebar{{!}}the article in the Mediawiki Manual}} {{#ifeq:{{FULLPAGENAME}}|Template:Sidebar|{{High-risk| approximately 145000 }}{{Template display|nomobile}}}} {{Lua|Module:Sidebar}} This template is a [[wikt:metatemplate|metatemplate]] for the creation of sidebar templates, i.e. boxes that are [[Vertical direction|vertically]] aligned [[Wikipedia:Navigation template|navigation templates]]. Sidebars, like [[Wikipedia:Manual of Style/Infoboxes|infoboxes]], are usually positioned on the right-hand side of a page. {{tl|Sidebar with collapsible lists}} is a version of {{tl|Sidebar}} that adds collapsibility to its sections, i.e. the means to show or hide sections by clicking links beside their headings. {{Navbox visibility}} Note that [[MOS:LEAD]] discourages the placement of sidebars in the lead section of articles. == Usage == {{Parameter names example |name= |outertitle |topimage |pretitle |title |image |caption |above |heading1 |content1 |heading2 |content2 |heading3 |content3 |content4=''…… etc ……'' |below}} <pre> {{Sidebar | name = {{subst:PAGENAME}} | class = | wraplinks = <!-- "true" otherwise (default:) omit --> | float = | templatestyles = | child templatestyles = | grandchild templatestyles = | outertitleclass = | outertitle = | topimageclass = | topimage = | topcaption = | pretitleclass = | pretitle = | titleclass = | title = | imageclass = | image = | caption = | headingclass = | contentclass = | aboveclass = | above = | heading1 = | heading1class = | content1 = | content1class = | heading2 = | heading2class = | content2 = | content2class = | heading3 = | heading3class = | content3 = | content3class = <!-- (omitting infinite heading/content parameters) --> | belowclass = | below = | navbar = }} </pre> Note that {{section link|Wikipedia:Manual of Style/Lead section#Elements}} discourages the placement of sidebars in the lead section of articles, though they may be included on a case-by-case basis. == Parameters == {{anchor|Other parameters}} No parameters are mandatory. If {{tl|navbar}} links are to function correctly (unless their appearance is suppressed; see the ''navbar'' parameter [[#Other parameters|below]]), the parameter ''name'' needs to be set (to [[Wikipedia:Page name|the name of]] the sidebar's page). (This does not apply if the [[Lua (programming language)|Lua module]] that produces {{tlf|Sidebar}}, [[Module:Sidebar]], is being used directly.) {| class="wikitable" |- ! scope="col" | Parameter ! scope="col" | Explanation |- | {{para|above}} | Same as the {{para|above}} offered by {{tl|Navbox}}. |- | {{para|name}} | The sidebar's name, i.e. the name following "Template:" in the title shown at the top of the sidebar's page. <br />Required if the {{small|{{smallcaps|V T E}}}} {{tl|navbar}} links at the bottom of the sidebar are to function correctly, unless their appearance is suppressed (see the ''navbar'' parameter [[#Other parameters|below]]) or {{tlf|Sidebar}} is not being used as a [[Wrapper function|wrapper]] for [[Module:Sidebar]]. When {{tlf|Sidebar}} is used as a wrapper, setting {{para|name|<nowiki>{{subst:PAGENAME}}</nowiki>}} is recommended. |- | {{para|float}} | Accepts the values <code>none</code> and <code>left</code>. The former aligns the box left without floating and the latter with floating behavior. The default float is right and does not need specifying. Prefer this parameter (and passing it to any using templates such as with {{tl|Helpbox}}) to specifying your own floats in TemplateStyles. |- | {{para|outertitle}} | Use to place a title for the sidebar immediately above the sidebar. |- | {{para|topimage}} |style="padding-left:0.5em;"| Use to place an image at the top of the sidebar, i.e. above {{para|title}} (if used). Full wiki syntax is expected (i.e. <code><nowiki>[[File:...]]</nowiki></code>). <br />To add a caption below the image, use {{para|topcaption}}. <br />Per [[WP:SIDEBAR]] this field should only be used to define a generic image for a sidebar, not to provide custom images for individual articles: sidebars are not displayed on mobile. |- | {{para|pretitle}} |style="padding-left:0.5em;"| Use to place a line such as "Part of the ''X'' series on" before the title. |- | {{para|title}} |style="padding-left:0.5em;"| Use to place a title for the sidebar at the top of the sidebar. (If {{para|topimage}} is used, it will appear immediately below it). |- | {{para|image}} |style="padding-left:0.5em;"| Use to place an image between the {{para|title}} (if used) and first section. As with {{para|topimage}}, full wiki syntax is expected (i.e. <code><nowiki>[[File:...]]</nowiki></code>). <br />To add a caption below the image, use {{para|caption}}. |- | {{para|heading<sub>n</sub>}}<br/>{{para|content<sub>n</sub>}} |style="padding-left:0.5em;"| The ''n''th heading{{\}}content. ''content<sub>n</sub>'' is required if ''heading<sub>n</sub>'' is also to appear. |- | {{para|templatestyles}} |style="padding-left:0.5em;"| See [[#TemplateStyles]]. |- | id="Classes" | *{{nowrap|{{para|class}} or {{para|bodyclass}}}} *{{para|outertitleclass}} *{{para|topimageclass}} *{{para|pretitleclass}} *{{para|titleclass}} *{{para|imageclass}} *{{para|aboveclass}} *{{para|headingclass}} *{{para|contentclass}} *{{para|heading<sub>n</sub>class}} *{{para|content<sub>n</sub>class}} *{{para|belowclass}} |style="padding-left:0.5em;"| Classes can be used to make styles easier to target for [[#TemplateStyles|TemplateStyles]]. {{para|class}} must be used for this purpose for an entire sidebar (otherwise a page with multiple sidebars may take styles intended only for one sidebar). An example for a template named "Template:Example Sidebar" might have the class {{para|class|example-sidebar}}. {{para|heading<sub>n</sub>class}} and {{para|content<sub>n</sub>class}} can be used to target a specific heading or content group. This should be needed only rarely. These classes can also be used for [[WP:microformats|microformats]]. Dot before a class-name can be omitted: {{para|class|foo}}. |- | {{para|below}} |style="padding-left:0.5em;"| Same as the {{para|below}} offered by {{tl|Navbox}}.<br />(Use, for example, to add one or more portal links to the bottom of the template (shown, by default, in bold).) |- | {{para|navbar}} |style="padding-left:0.5em;"| When {{para|name}} is specified, {{tl|navbar}} is shown at the bottom of the sidebar. Setting {{para|navbar|off}} or {{para|navbar|none}} will suppress the {{navbar|Sidebar/doc|mini=1}} links showing. |} === TemplateStyles === {{further|Wikipedia:TemplateStyles}} The TemplateStyles parameters {{para|templatestyles}}, {{para|child templatestyles}}, and {{para|grandchild templatestyles}} take the pagename of a [[WP:TemplateStyles|TemplateStyles]] page and turn it into a TemplateStyles tag. The TemplateStyles tag is a much more powerful way to add styling to a sidebar. Some rules of use: # Always add a template-specific class in {{para|class}} so that the styles added to one sidebar will not "leak" into another sidebar. For example, [[Template:DYK tools]] has {{para|class|dyk-tools}} and the [[Template:DYK tools/styles.css]] page targets <code>.dyk-tools</code> for all of its added styling. # Do not assume Template:Sidebar will continue to have a table structure (i.e., do not target <code>table</code> or any other table HTML in the TemplateStyles page). The table structure is soft-deprecated and will go away at some point in the future. These tags are loaded in this order: Core templatestyles ([[Module:Sidebar/styles.css]]), templatestyles, child, and then grandchild, which can be used to 'cascade' the styles. ; {{para|templatestyles}} : This parameter is intended for a template or module calling {{tl|sidebar}} directly. ; {{para|child templatestyles}} : This parameter is intended for a template or module which calls a sidebar with {{para|templatestyles}}. ; {{para|grandchild templatestyles}} : This parameter is intended for a template or module which calls a sidebar with {{para|child templatestyles}}. The canonical list of classes output with each kind of element of a sidebar (i.e. output for all {{para|content<sub>n</sub>}}, or all cases of {{para|above}}) can be found in [[Module:Sidebar/configuration]] in the "class" table. The below is a non-authoritative but otherwise sufficient list for most generic styling: {{div col}} ; <code>.sidebar</code> : The top-level sidebar class. ; <code>.sidebar-outer-title</code> : The class associated with a {{para|outertitle}}. ; <code>.sidebar-top-image</code> : The class associated with a {{para|topimage}}. ; <code>.sidebar-top-caption</code> : The class associated with a {{para|topcaption}}. ; <code>.sidebar-pretitle</code> ; <code>.sidebar-pretitle-with-top-image</code> : The classes associated with a {{para|pretitle}}. Only one of these will be output per sidebar, depending on whether {{para|topimage}} is present. ; <code>.sidebar-title</code> ; <code>.sidebar-title-with-pretitle</code> : The classes associated with a {{para|title}}. Only one of these will be output per sidebar, depending on whether {{para|pretitle}} is present. ; <code>.sidebar-image</code> : The class associated with a {{para|image}}. ; <code>.sidebar-caption</code> : The class associated with a {{para|caption}}. ; <code>.sidebar-above</code> : The class associated with a {{para|above}}. ; <code>.sidebar-heading</code> : The class associated with a {{para|heading<sub>n</sub>}}. Every heading will have this class. ; <code>.sidebar-content</code> ; <code>.sidebar-content-with-subgroup</code> : The classes associated with {{para|content<sub>n</sub>}}. Every content group will have one of these classes, depending on whether the specific content has a subgroup. ; <code>.sidebar-below</code> : The class associated with a {{para|below}}. ; <code>.sidebar-navbar</code> : The class associated with a {{para|navbar}}. {{div col end}} ==== Example TemplateStyles parameter use ==== For an example of a sidebar which does not need to support children templates of its own (whether because it has no children or because it wants no children): <pre> {{Sidebar | title = Child Example | class = sidebar-example | templatestyles = Template:Sidebar/example/styles.css }} </pre> For an example of a sidebar which does have its own children and an example of one of the children (grandchild templates have a similar use): <div style="display: flex"> <pre> {{Sidebar | title = {{{title|Title Child Example}}} | class = sidebar-example {{{class|}}} | templatestyles = Template:Sidebar/example/styles.css | child templatestyles = {{{child templatestyles|}}} }} </pre> <pre> {{Sidebar/child example | title = Title Grandchild Example | class = sidebar-child-example | child templatestyles = Template:Sidebar/child example/styles.css }} </pre> </div> == Handling long links == {{tl|Normalwraplink}} may be used to handle individual links that should wrap within the sidebar or otherwise need to be made to wrap, in order to prevent the sidebar from becoming too wide. Use {{tlx|normalwraplink|{{var|longlinkname}}}}, where {{para||{{var|longlinkname}}}} is the long link without its square brackets. Use the {{para|wraplinks|true}} parameter to enable link wrapping (disabling {{codett|lang=css|nowraplinks}} CSS class) for the whole template. == Nesting == One sidebar template can be nested (embedded) into another one by using the {{para|child}} parameter. This feature can be used to create a modular sidebar, or to create more well-defined and logical sections. {{Sidebar | title = Top-level title | content1 = {{Sidebar |child=yes | title = First subsection | heading1 = Heading 1.1 | content1 = Content 1.1 }} | content2 = {{Sidebar |child=yes | title = Second subsection | heading1 = Heading 2.1 | content1 = Content 2.1 }} | below = "below" text }} <pre style="position:relative;bottom:0.5em; overflow:auto;"> {{Sidebar | title = Top-level title | content1 = {{Sidebar |child=yes | title = First subsection | heading1 = Heading 1.1 | content1 = Content 1.1 }} | content2 = {{Sidebar |child=yes | title = Second subsection | heading1 = Heading 2.1 | content1 = Content 2.1 }} | below = "below" text }} </pre> Note in the examples above that the child sidebar is placed in a {{code|content}} field, not a {{code|heading}} field. Notice also that the section subheadings do not appear in bold if this is not explicitly specified. To obtain bold section headings, move the titles to the {{code|heading}} field, using {{Sidebar | title = Top-level title | heading1 = First subsection | content1 = {{Sidebar |child=yes | heading1 = Heading 1.1 | content1 = Content 1.1 }} | heading2 = Second subsection | content2 = {{Sidebar |child=yes | heading1 = Heading 2.1 | content1 = Content 2.1 }} | below = "below" text }} <pre style="position:relative;bottom:0.5em; overflow:auto;"> {{Sidebar | title = Top-level title | heading1 = First subsection | content1 = {{Sidebar |child=yes | heading1 = Heading 1.1 | content1 = Content 1.1 }} | heading2 = Second subsection | content2 = {{Sidebar |child=yes | heading1 = Heading 2.1 | content1 = Content 2.1 }} | below = "below" text }} </pre> == Deprecated parameters == The following parameters are deprecated in favor of [[#TemplateStyles|TemplateStyles]] and templates/modules using them are categorized into [[:Category:Sidebars with styles needing conversion]]. The category page has further conversion information. A specific real conversion example is [[Template:DYK tools]] where the [[Special:Diff/1002727584|styles were moved]] to [[Template:DYK tools/styles.css]]. {| class="wikitable" |- ! scope="col" | Parameter ! scope="col" | Explanation ! scope="col" | TemplateStyles replacement class |- | {{nowrap|{{para|style}} or {{para|bodystyle}}}} | Additional [[Help:Cascading Style Sheets|CSS]] for the whole sidebar. | Class assigned to the template in {{para|class}} |- | {{para|basestyle}} | Additional CSS for a grabbag of parameters: {{para|pretitle}}, {{para|title}}, {{para|heading<sub>n</sub>}}, and {{para|listtitle<sub>n</sub>}} (for {{tl|sidebar with collapsible lists}}). | See related parameters for targeting pretitle, title, all headings, and all lists. Applies {{em|before}} the specific style parameter so must be placed above that parameter's declarations if any in the TemplateStyles sheet. |- |{{para|outertitlestyle}} |Additional CSS for {{Para|outertitle}}. | {{code|lang=css|.sidebar-outer-title}} |- |{{para|topimagestyle}} |Additional CSS for {{Para|topimage}}. | {{code|lang=css|.sidebar-top-image}} |- |{{para|topcaptionstyle}} |Additional CSS for {{Para|topcaption}}. | {{code|lang=css|.sidebar-topcaption}} |- |{{para|pretitlestyle}} |Additional CSS for {{Para|pretitle}}. | {{code|lang=css|.sidebar-pretitle}} or {{code|lang=css|.sidebar-pretitle-with-top-image}} |- |{{para|titlestyle}} |Additional CSS for {{Para|title}}. | {{code|lang=css|.sidebar-title}} or {{code|lang=css|.sidebar-title-with-pretitle}} |- |{{para|imagestyle}} |Additional CSS for {{Para|image}}. | {{code|lang=css|.sidebar-image}} |- |{{para|captionstyle}} |Additional CSS for {{Para|caption}}. | {{code|lang=css|.sidebar-caption}} |- |{{para|abovestyle}} |Additional CSS for {{Para|above}}. | {{code|lang=css|.sidebar-above}} |- | {{para|headingstyle}} | Additional CSS for section headings. | {{code|lang=css|.sidebar-heading}} |- | {{para|heading<sub>n</sub>style}} | Additional CSS for {{Para|heading<sub>n</sub>}}. | Class assigned to the heading in {{para|heading<sub>n</sub>class}} |- | {{para|contentstyle}} | Additional CSS for all section content. | {{code|lang=css|.sidebar-content}} and/or {{code|lang=css|.sidebar-content-with-subgroup}} |- | {{para|content<sub>n</sub>style}} | Additional CSS for {{Para|content<sub>n</sub>}}. | Class assigned to the content in {{para|content<sub>n</sub>class}} |- | {{para|belowstyle}} | Additional CSS for {{Para|below}}. | {{code|lang=css|.sidebar-below}} |- | {{para|navbarstyle}} | Additional CSS for the generated navbar. | {{code|lang=css|.sidebar-navbar}} |- | {{para|navbarfontstyle}} | Additional CSS passed to the navbar module to target the VTE (colors usually). | {{code|lang=css|.sidebar-navbar li, .sidebar-navbar a}} |} == Tracking category == * {{clc|Pages using sidebar with the child parameter}} * {{clc|Sidebars with styles needing conversion}} == See also == * [[Special:Permalink/609911857|Last pre-Lua version]] * {{tl|Sidebar with collapsible lists}} * {{tl|Infobox}} * {{tl|Side box}} * [[Wikipedia:UBLIST]], for help using unbulleted lists within content. <includeonly>{{Sandbox other|| [[Category:Sidebar meta-templates| ]] [[Category:Templates that add a tracking category]] }}</includeonly> 9d0f725376f726cc8c0e0c95eb2c2dbea394caec Module:Sidebar 828 136 153 2023-10-08T09:20:54Z Silentg 2 Created page with "require('strict') local cfg = mw.loadData('Module:Sidebar/configuration') local p = {} local getArgs = require('Module:Arguments').getArgs --[[ Categorizes calling templates and modules with a 'style' parameter of any sort for tracking to convert to TemplateStyles. TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module. TODO would probably want to remove /log and /archive as CS1 does ]] local function categorizeTemplatesWithInlineStyle..." Scribunto text/plain require('strict') local cfg = mw.loadData('Module:Sidebar/configuration') local p = {} local getArgs = require('Module:Arguments').getArgs --[[ Categorizes calling templates and modules with a 'style' parameter of any sort for tracking to convert to TemplateStyles. TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module. TODO would probably want to remove /log and /archive as CS1 does ]] local function categorizeTemplatesWithInlineStyles(args) local title = mw.title.getCurrentTitle() if title.namespace ~= 10 and title.namespace ~= 828 then return '' end for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do if title.text:match(pattern) then return '' end end for key, _ in pairs(args) do if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then return cfg.i18n.category.conversion end end end --[[ For compatibility with the original {{sidebar with collapsible lists}} implementation, which passed some parameters through {{#if}} to trim their whitespace. This also triggered the automatic newline behavior. ]] -- See ([[meta:Help:Newlines and spaces#Automatic newline]]) local function trimAndAddAutomaticNewline(s) s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1") if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then return '\n' .. s else return s end end --[[ Finds whether a sidebar has a subgroup sidebar. ]] local function hasSubgroup(s) if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then return true else return false end end local function has_navbar(navbar_mode, sidebar_name) return navbar_mode ~= cfg.i18n.navbar_none and navbar_mode ~= cfg.i18n.navbar_off and ( sidebar_name or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~= cfg.i18n.title_not_to_add_navbar ) end local function has_list_class(args, htmlclass) local patterns = { '^' .. htmlclass .. '$', '%s' .. htmlclass .. '$', '^' .. htmlclass .. '%s', '%s' .. htmlclass .. '%s' } for arg, value in pairs(args) do if type(arg) == 'string' and mw.ustring.find(arg, 'class') then for _, pattern in ipairs(patterns) do if mw.ustring.find(args[arg] or '', pattern) then return true end end end end return false end -- there are a lot of list classes in the wild, so we add their TemplateStyles local function add_list_styles(args) local frame = mw.getCurrentFrame() local function add_list_templatestyles(htmlclass, templatestyles) if has_list_class(args, htmlclass) then return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } else return '' end end local plainlist_styles = add_list_templatestyles('plainlist', cfg.i18n.plainlist_templatestyles) local hlist_styles = add_list_templatestyles('hlist', cfg.i18n.hlist_templatestyles) -- a second workaround for [[phab:T303378]] -- when that issue is fixed, we can actually use has_navbar not to emit the -- tag here if we want if has_navbar(args.navbar, args.name) and hlist_styles == '' then hlist_styles = frame:extensionTag{ name = 'templatestyles', args = { src = cfg.i18n.hlist_templatestyles} } end -- hlist -> plainlist is best-effort to preserve old Common.css ordering. [hlist_note] return hlist_styles .. plainlist_styles end -- work around [[phab:T303378]] -- for each arg: find all the templatestyles strip markers, insert them into a -- table. then remove all templatestyles markers from the arg local function move_hiding_templatestyles(args) local gfind = string.gfind local gsub = string.gsub local templatestyles_markers = {} local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)' for k, arg in pairs(args) do for marker in gfind(arg, strip_marker_pattern) do table.insert(templatestyles_markers, marker) end args[k] = gsub(arg, strip_marker_pattern, '') end return templatestyles_markers end --[[ Main sidebar function. Takes the frame, args, and an optional collapsibleClass. The collapsibleClass is and should be used only for sidebars with collapsible lists, as in p.collapsible. ]] function p.sidebar(frame, args, collapsibleClass) if not args then args = getArgs(frame) end local hiding_templatestyles = table.concat(move_hiding_templatestyles(args)) local root = mw.html.create() local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes root = root:tag('table') if not child then root :addClass(cfg.i18n.class.sidebar) -- force collapsibleclass to be sidebar-collapse otherwise output nothing :addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil) :addClass('nomobile') :addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil) :addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil) :addClass(args.wraplinks ~= cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil) :addClass(args.bodyclass or args.class) :css('width', args.width or nil) :cssText(args.bodystyle or args.style) if args.outertitle then root :tag('caption') :addClass(cfg.i18n.class.outer_title) :addClass(args.outertitleclass) :cssText(args.outertitlestyle) :wikitext(args.outertitle) end if args.topimage then local imageCell = root:tag('tr'):tag('td') imageCell :addClass(cfg.i18n.class.top_image) :addClass(args.topimageclass) :cssText(args.topimagestyle) :wikitext(args.topimage) if args.topcaption then imageCell :tag('div') :addClass(cfg.i18n.class.top_caption) :cssText(args.topcaptionstyle) :wikitext(args.topcaption) end end if args.pretitle then root :tag('tr') :tag('td') :addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image or cfg.i18n.class.pretitle) :addClass(args.pretitleclass) :cssText(args.basestyle) :cssText(args.pretitlestyle) :wikitext(args.pretitle) end else root :addClass(cfg.i18n.class.subgroup) :addClass(args.bodyclass or args.class) :cssText(args.bodystyle or args.style) end if args.title then if child then root :wikitext(args.title) else root :tag('tr') :tag('th') :addClass(args.pretitle and cfg.i18n.class.title_with_pretitle or cfg.i18n.class.title) :addClass(args.titleclass) :cssText(args.basestyle) :cssText(args.titlestyle) :wikitext(args.title) end end if args.image then local imageCell = root:tag('tr'):tag('td') imageCell :addClass(cfg.i18n.class.image) :addClass(args.imageclass) :cssText(args.imagestyle) :wikitext(args.image) if args.caption then imageCell :tag('div') :addClass(cfg.i18n.class.caption) :cssText(args.captionstyle) :wikitext(args.caption) end end if args.above then root :tag('tr') :tag('td') :addClass(cfg.i18n.class.above) :addClass(args.aboveclass) :cssText(args.abovestyle) :newline() -- newline required for bullet-points to work :wikitext(args.above) end local rowNums = {} for k, v in pairs(args) do k = '' .. k local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$') if num then table.insert(rowNums, tonumber(num)) end end table.sort(rowNums) -- remove duplicates from the list (e.g. 3 will be duplicated if both heading3 -- and content3 are specified) for i = #rowNums, 1, -1 do if rowNums[i] == rowNums[i - 1] then table.remove(rowNums, i) end end for i, num in ipairs(rowNums) do local heading = args['heading' .. num] if heading then root :tag('tr') :tag('th') :addClass(cfg.i18n.class.heading) :addClass(args.headingclass) :addClass(args['heading' .. num .. 'class']) :cssText(args.basestyle) :cssText(args.headingstyle) :cssText(args['heading' .. num .. 'style']) :newline() :wikitext(heading) end local content = args['content' .. num] if content then root :tag('tr') :tag('td') :addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup or cfg.i18n.class.content) :addClass(args.contentclass) :addClass(args['content' .. num .. 'class']) :cssText(args.contentstyle) :cssText(args['content' .. num .. 'style']) :newline() :wikitext(content) :done() -- Without a linebreak after the </td>, a nested list like -- "* {{hlist| ...}}" doesn't parse correctly. :newline() end end if args.below then root :tag('tr') :tag('td') :addClass(cfg.i18n.class.below) :addClass(args.belowclass) :cssText(args.belowstyle) :newline() :wikitext(args.below) end if not child and has_navbar(args.navbar, args.name) then root :tag('tr') :tag('td') :addClass(cfg.i18n.class.navbar) :cssText(args.navbarstyle) :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, fontstyle = args.navbarfontstyle }) end local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = cfg.i18n.templatestyles } } local templatestyles = '' if args['templatestyles'] and args['templatestyles'] ~= '' then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] and args['child templatestyles'] ~= '' then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ add_list_styles(args), -- see [hlist_note] above about ordering base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles, hiding_templatestyles, tostring(root), (child and cfg.i18n.category.child or ''), categorizeTemplatesWithInlineStyles(args) }) end local function list_title(args, is_centered_list_titles, num) local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title'] or cfg.i18n.default_list_title) local title if is_centered_list_titles then -- collapsible can be finicky, so provide some CSS/HTML to support title = mw.html.create('div') :addClass(cfg.i18n.class.list_title_centered) :wikitext(title_text) else title = mw.html.create() :wikitext(title_text) end local title_container = mw.html.create('div') :addClass(cfg.i18n.class.list_title) -- don't /need/ a listnumtitleclass because you can do -- .templateclass .listnumclass .sidebar-list-title :addClass(args.listtitleclass) :cssText(args.basestyle) :cssText(args.listtitlestyle) :cssText(args['list' .. num .. 'titlestyle']) :node(title) :done() return title_container end --[[ Main entry point for sidebar with collapsible lists. Does the work of creating the collapsible lists themselves and including them into the args. ]] function p.collapsible(frame) local args = getArgs(frame) if not args.name and frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') == cfg.i18n.collapse_title_not_to_add_navbar then args.navbar = cfg.i18n.navbar_none end local contentArgs = {} local is_centered_list_titles = false if args['centered list titles'] and args['centered list titles'] ~= '' then is_centered_list_titles = true end for k, v in pairs(args) do local num = string.match(k, '^list(%d+)$') if num then local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name']) local row = mw.html.create('div') row :addClass(cfg.i18n.class.list) :addClass('mw-collapsible') :addClass((not expand) and 'mw-collapsed' or nil) :addClass(args['list' .. num .. 'class']) :cssText(args.listframestyle) :cssText(args['list' .. num .. 'framestyle']) :node(list_title(args, is_centered_list_titles, num)) :tag('div') :addClass(cfg.i18n.class.list_content) :addClass('mw-collapsible-content') -- don't /need/ a listnumstyleclass because you can do -- .templatename .listnumclass .sidebar-list :addClass(args.listclass) :cssText(args.liststyle) :cssText(args['list' .. num .. 'style']) :wikitext(trimAndAddAutomaticNewline(args['list' .. num])) contentArgs['content' .. num] = tostring(row) end end for k, v in pairs(contentArgs) do args[k] = v end return p.sidebar(frame, args, cfg.i18n.class.collapse) end return p 71fe765846593e025ca2f94371315e9dbb5bb4d2 Module:Sidebar/doc 828 137 154 2023-10-08T09:21:21Z Silentg 2 Created page with "{{High-risk|155000+}} {{module rating|protected}} {{Lua|Module:Sidebar/configuration|Module:Navbar|Module:Arguments}} {{Uses TemplateStyles|Module:Sidebar/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module implements the templates {{tl|sidebar}} and {{tl|sidebar with collapsible lists}}. See the individual template pages for documentation. <includeonly>{{sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> Category..." wikitext text/x-wiki {{High-risk|155000+}} {{module rating|protected}} {{Lua|Module:Sidebar/configuration|Module:Navbar|Module:Arguments}} {{Uses TemplateStyles|Module:Sidebar/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}} This module implements the templates {{tl|sidebar}} and {{tl|sidebar with collapsible lists}}. See the individual template pages for documentation. <includeonly>{{sandbox other|| <!-- Categories below this line; interwikis at Wikidata --> [[Category:Sidebar meta-templates| ]] [[Category:Modules that add a tracking category]] [[Category:Modules that check for strip markers]] }}</includeonly> 710222793e9c5fe515b611d11ddac712a409e814 Module:Sidebar/configuration 828 138 155 2023-10-08T09:21:57Z Silentg 2 Created page with "return { i18n = { child_yes = 'yes', float_none = 'none', float_left = 'left', wrap_true = 'true', navbar_none = 'none', navbar_off = 'off', default_list_title = 'List', title_not_to_add_navbar = 'Template:Sidebar', collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists', templatestyles = 'Module:Sidebar/styles.css', hlist_templatestyles = 'Hlist/styles.css', plainlist_templatestyles = 'Plainlist/styles.css', category = {..." Scribunto text/plain return { i18n = { child_yes = 'yes', float_none = 'none', float_left = 'left', wrap_true = 'true', navbar_none = 'none', navbar_off = 'off', default_list_title = 'List', title_not_to_add_navbar = 'Template:Sidebar', collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists', templatestyles = 'Module:Sidebar/styles.css', hlist_templatestyles = 'Hlist/styles.css', plainlist_templatestyles = 'Plainlist/styles.css', category = { child = '[[Category:Pages using sidebar with the child parameter]]', conversion = '[[Category:Sidebars with styles needing conversion]]' }, pattern = { collapse_sandbox = '/sandbox$', sandbox = '/sandbox$', subgroup = 'sidebar%-subgroup', style_conversion = 'style$', uncategorized_conversion_titles = { '/[Ss]andbox', '/[Tt]estcases', '/[Dd]oc$' } }, class = { sidebar = 'sidebar', subgroup = 'sidebar-subgroup', collapse = 'sidebar-collapse', float_none = 'sidebar-none', float_left = 'sidebar-left', wraplinks = 'nowraplinks', outer_title = 'sidebar-outer-title', top_image = 'sidebar-top-image', top_caption = 'sidebar-top-caption', pretitle = 'sidebar-pretitle', pretitle_with_top_image = 'sidebar-pretitle-with-top-image', title = 'sidebar-title', title_with_pretitle = 'sidebar-title-with-pretitle', image = 'sidebar-image', caption = 'sidebar-caption', above = 'sidebar-above', heading = 'sidebar-heading', content = 'sidebar-content', content_with_subgroup = 'sidebar-content-with-subgroup', below = 'sidebar-below', navbar = 'sidebar-navbar', list = 'sidebar-list', list_title = 'sidebar-list-title', list_title_centered = 'sidebar-list-title-c', list_content = 'sidebar-list-content' } } } dc2a980ac2162a898f7c21e6d6ba7e994dfeb315 Module:Sidebar/styles.css 828 139 156 2023-10-08T09:23:28Z Silentg 2 Created page with "/* {{pp-template}} */ /* TODO: Invert width design to be "mobile first" */ .sidebar { /* TODO: Ask if we should have max-width 22em instead */ width: 22em; /* @noflip */ float: right; /* @noflip */ clear: right; /* @noflip */ margin: 0.5em 0 1em 1em; background: #f8f9fa; border: 1px solid #aaa; padding: 0.2em; text-align: center; line-height: 1.4em; font-size: 88%; border-collapse: collapse; /* Timeless has display: none on .nomobile at mobile resolutions..." sanitized-css text/css /* {{pp-template}} */ /* TODO: Invert width design to be "mobile first" */ .sidebar { /* TODO: Ask if we should have max-width 22em instead */ width: 22em; /* @noflip */ float: right; /* @noflip */ clear: right; /* @noflip */ margin: 0.5em 0 1em 1em; background: #f8f9fa; border: 1px solid #aaa; padding: 0.2em; text-align: center; line-height: 1.4em; font-size: 88%; border-collapse: collapse; /* Timeless has display: none on .nomobile at mobile resolutions, so we * unhide it with display: table and let precedence and proximity win. */ display: table; } /* Unfortunately, so does Minerva desktop, except Minerva drops an * !important on the declaration. So we have to be mean for Minerva users. * Mobile removes the element entirely with `wgMFRemovableClasses` in * https://github.com/wikimedia/operations-mediawiki-config/blob/master/ wmf-config/InitialiseSettings.php#L16992 * which is why displaying it categorically with display: table works. * We don't really want to expose the generic user in the wild on mobile to have * to deal with sidebars. (Maybe the ones with collapsible lists, so that * might be an improvement. That is blocked on [[:phab:T111565]].) */ body.skin-minerva .sidebar { display: table !important; /* also, minerva is way too aggressive about other stylings on tables. * TODO remove when this template gets moved to a div. plans on talk page. * We always float right on Minerva because that's a lot of extra CSS * otherwise. */ float: right !important; margin: 0.5em 0 1em 1em !important; } .sidebar-subgroup { width: 100%; margin: 0; border-spacing: 0; } .sidebar-left { /* @noflip */ float: left; /* @noflip */ clear: left; /* @noflip */ margin: 0.5em 1em 1em 0; } .sidebar-none { float: none; clear: both; /* @noflip */ margin: 0.5em 1em 1em 0; } .sidebar-outer-title { padding: 0 0.4em 0.2em; font-size: 125%; line-height: 1.2em; font-weight: bold; } .sidebar-top-image { padding: 0.4em; } .sidebar-top-caption, .sidebar-pretitle-with-top-image, .sidebar-caption { padding: 0.2em 0.4em 0; line-height: 1.2em; } .sidebar-pretitle { padding: 0.4em 0.4em 0; line-height: 1.2em; } .sidebar-title, .sidebar-title-with-pretitle { padding: 0.2em 0.8em; font-size: 145%; line-height: 1.2em; } .sidebar-title-with-pretitle { padding: 0.1em 0.4em; } .sidebar-image { padding: 0.2em 0.4em 0.4em; } .sidebar-heading { padding: 0.1em 0.4em; } .sidebar-content { padding: 0 0.5em 0.4em; } .sidebar-content-with-subgroup { padding: 0.1em 0.4em 0.2em; } .sidebar-above, .sidebar-below { padding: 0.3em 0.8em; font-weight: bold; } .sidebar-collapse .sidebar-above, .sidebar-collapse .sidebar-below { border-top: 1px solid #aaa; border-bottom: 1px solid #aaa; } .sidebar-navbar { text-align: right; font-size: 115%; padding: 0 0.4em 0.4em; } .sidebar-list-title { padding: 0 0.4em; text-align: left; font-weight: bold; line-height: 1.6em; font-size: 105%; } /* centered text with mw-collapsible headers is finicky */ .sidebar-list-title-c { padding: 0 0.4em; text-align: center; margin: 0 3.3em; } @media (max-width: 720px) { /* users have wide latitude to set arbitrary width and margin :( "Super-specific" selector to prevent overriding this appearance by lower level sidebars too */ body.mediawiki .sidebar { width: 100% !important; clear: both; float: none !important; /* Remove when we div based; Minerva is dumb */ margin-left: 0 !important; margin-right: 0 !important; } /* TODO: We might consider making all links wrap at small resolutions and then * only introduce nowrap at higher resolutions. Do when we invert the media * query. */ } 7d621b35a37807a103b59075851fe36201204ceb User:Silentg/sandbox 2 80 157 96 2023-10-08T09:32:26Z Silentg 2 wikitext text/x-wiki {{Infobox |name = Infobox/doc |bodystyle = width:20em |titlestyle = |title = Test Infobox |headerstyle = |labelstyle = width:33% |datastyle = |header1 = | label1 = Label 1 | data1 = Data 1 |header2 = | label2 = Label 2 | data2 = Data 2 |header3 = | label3 = Label 3 | data3 = Data 3 |header4 = Header 4 | label4 = | data4 = |header5 = | label5 = Label 5 | data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. |belowstyle = |below = Below text }} c4c20ed5340f6ae1f9d0d082427d36c5647d799d MediaWiki:Common.css 8 140 158 2023-10-08T09:35:05Z Silentg 2 Created page with "/* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-da..." css text/css /* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } 813e35932daf7e0664ecf574cd23597074b79f45 Template:Tlg/doc 10 141 159 2023-10-08T09:51:58Z Silentg 2 Redirected page to [[Template:Template link general/doc]] wikitext text/x-wiki #REDIRECT [[Template:Template link general/doc]] {{Redirect category shell| {{R from move}} }} a63e5d7ae3ef1cf01f91aefa893333ab9aa84899 Template:Talk other 10 142 160 2023-10-08T09:53:56Z Silentg 2 Created page with "{{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}} | talk | other }} }} | talk = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} </noinclude>" wikitext text/x-wiki {{#switch: <!--If no or empty "demospace" parameter then detect namespace--> {{#if:{{{demospace|}}} | {{lc: {{{demospace}}} }} <!--Use lower case "demospace"--> | {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}} | talk | other }} }} | talk = {{{1|}}} | other | #default = {{{2|}}} }}<!--End switch--><noinclude> {{documentation}} </noinclude> a8a973e372c5984a59953eb0cb4767a03dc6cd3c Template:Talk other/doc 10 143 161 2023-10-08T09:55:37Z Silentg 2 Created page with "{{Documentation subpage}} {{High-risk| 143933 }} <!--Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])--> This is the {{tl|talk other}} meta-template. This template helps other templates detect if they are on a talk page or some "other" type of page. == Usage == This template usually takes two parameters, like this: <syntaxhighlight lang="wikitext"> {{talk other | Talk pages text | Other pages text }} <..." wikitext text/x-wiki {{Documentation subpage}} {{High-risk| 143933 }} <!--Categories where indicated at the bottom of this page, please; interwikis at Wikidata (see [[Wikipedia:Wikidata]])--> This is the {{tl|talk other}} meta-template. This template helps other templates detect if they are on a talk page or some "other" type of page. == Usage == This template usually takes two parameters, like this: <syntaxhighlight lang="wikitext"> {{talk other | Talk pages text | Other pages text }} </syntaxhighlight> If the template is on any talk page, it will return this: :{{talk other | demospace=talk | Talk pages text | Other pages text }} If the template is on any other page, it will return this: :{{talk other | Talk page text | Other pages text }} A typical usage case could be to make it so that a template only adds a category when on talk pages. Thus not adding other pages that just show the template. Like this: <syntaxhighlight lang="wikitext"> {{talk other | [[Category:Some talk page category]] }} </syntaxhighlight> Or to warn that a template should not be used on other pages: <syntaxhighlight lang="wikitext"> {{talk other | | This template should only be used on talk pages. }} </syntaxhighlight> Note that in the first case above the "other" parameter was not used, and in the second example the "talk" parameter was left empty. == Demospace == For testing and demonstration purposes this template can take a parameter named '''demospace'''. * If it has the value '''talk''' it returns the talk pages text. * It if has the value '''other''' or any other value such as the name of some other namespace it returns the other pages text. * If the parameter is empty or undefined, the actual page type determines the result. Like this: <syntaxhighlight lang="wikitext"> {{talk other | Talk pages text | Other pages text | demospace = talk }} </syntaxhighlight> No matter on what kind of page the code above is used it will return this: :{{talk other | Talk pages text | Other pages text | demospace = talk }} You can make it so your template also understands the '''demospace''' parameter. That means you can demonstrate the different appearances of your template in the documentation for your template. Then do like this: <syntaxhighlight lang="wikitext"> {{talk other | Talk pages text | Other pages text | demospace = {{{demospace|}}} }} </syntaxhighlight> == Technical details == This template detects all types of talk pages as type '''talk'''. That is, "Talk:", "User talk:", "File talk:" and so on are all of type '''talk'''. This template works like {{tl|main talk other}}, for more examples and technical details see full documentation there. {{Namespace and pagename-detecting templates}} <includeonly>{{Sandbox other| | <!--Categories below this line, please; interwikis at Wikidata--> [[Category:Namespace manipulation templates]] [[Category:Talk namespace templates]] }}</includeonly> 4fd6392f9a52601948987b1c19e9e20871137ec6 Template:Cat 10 144 162 2023-10-08T09:57:14Z Silentg 2 Created page with "[[:Category:{{PAGENAME:{{{1}}}}}]]<noinclude> {{documentation}} </noinclude>" wikitext text/x-wiki [[:Category:{{PAGENAME:{{{1}}}}}]]<noinclude> {{documentation}} </noinclude> 1bc496e43140b2151295691ec72e6d251bb0b6cb Template:Cat/doc 10 145 163 2023-10-08T09:58:30Z Silentg 2 Created page with "{{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> === Usage === Creates a link to the specified category. Canonalizes the displayed category name. '''Example:''' * {{tlx|Cat|Stubs}} → {{Cat|Stubs}} * {{tlx|Cat|stubs}} → {{Cat|stubs}} * {{tlx|Cat|cat:stubs}} → {{Cat|Category:stubs}} * {{tlx|Cat|category:stubs}} → {{Cat|Category:stubs}} === See also === * {{tl|c}} – pipetricked category name &ndash; skips 'Categ..." wikitext text/x-wiki {{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> === Usage === Creates a link to the specified category. Canonalizes the displayed category name. '''Example:''' * {{tlx|Cat|Stubs}} → {{Cat|Stubs}} * {{tlx|Cat|stubs}} → {{Cat|stubs}} * {{tlx|Cat|cat:stubs}} → {{Cat|Category:stubs}} * {{tlx|Cat|category:stubs}} → {{Cat|Category:stubs}} === See also === * {{tl|c}} – pipetricked category name &ndash; skips 'Category:' and displays bare link. * {{tl|cl}} – links to category and includes the 'Category:' label * {{tl|cls}} – compromise macro between 'C' and 'Cat': <nowiki>[[:Category:{{{1}}}|Cat:{{{1}}}]]</nowiki> * {{tl|catlist}} – list of many, variable output format * {{tl|cat see also}} – list of many, fixed output format for a category-namespace hatnote '''With administration links:''' * {{tl|lc}} – Category name and full links &ndash; for administration and discussion pages * {{tl|lcs}} – Category name and '''s'''maller set of links &ndash; same purposes, <br />but note, both are useful from within preview screens as well to explore and study relationships, or make related changes. <includeonly>{{sandbox other|| [[Category:Internal category-link templates]] }}</includeonly> aed0cd48d61554becf03fe81b01ddbec48bca004 Template:Userbox 10 146 164 2023-10-08T10:05:44Z Silentg 2 Created page with "{{#invoke:userbox|userbox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>" wikitext text/x-wiki {{#invoke:userbox|userbox}}<noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 43f31821f815f586868b4e5ea3e7116d7b972f58 Template:Userbox/doc 10 147 165 2023-10-08T10:06:26Z Silentg 2 Created page with "{{Documentation subpage}} {{Lua|Module:Userbox}} {{High-use}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> This template can be used to quickly create a [[Wikipedia:Userboxes|userbox]] for display on a user's [[Wikipedia:User pages|user page]] without having to know HTML or Wikitable syntax. '''''[[WP:NFCC|Nonfree]] images must not be displayed in userboxes, and are subject to summary removal by any editor without any notice being re..." wikitext text/x-wiki {{Documentation subpage}} {{Lua|Module:Userbox}} {{High-use}} <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> This template can be used to quickly create a [[Wikipedia:Userboxes|userbox]] for display on a user's [[Wikipedia:User pages|user page]] without having to know HTML or Wikitable syntax. '''''[[WP:NFCC|Nonfree]] images must not be displayed in userboxes, and are subject to summary removal by any editor without any notice being required.''''' == Sandbox reminder== * Always practice or experiment in the [[Template:Userbox/sandbox]] or [[Template:Userbox/testcases]] * Once you are satisfied: Copy your code! * In your Browser's address bar, change "sandbox" or "testcases" to the name of your new Userbox. ** Example: ** '''CHANGE''' [{{Fullurl:Template:Userbox/sandbox}} http://en.wikipedia.org/wiki/Template:Userbox/sandbox]<!--Display http://, but allow possibility of https:// access.--> ** '''TO''' [{{Fullurl:Template:Userbox/sandbox}} https://en.wikipedia.org/wiki/Template:Userbox/WhateverYourNewBoxNameIs] ** If the name of your new Userbox is taken, create a different name. * You will be prompted to Start or Create your new Template Userbox! * Paste your code into the space provided. == Usage == <!-- Abstract usage of the template, one variable per row. --> <syntaxhighlight lang="wikitext" style="overflow: auto"> {{userbox | bodyclass = <!--Adds an HTML class attribute to the entire template's HTML table, to allow for styling, emission of microformats, etc.--> | border-c = <!--border color (default=id-c or #999999)--> | border-s = <!--border width in pixels (default=1)--> | float = <!--left|right|none (default=left)--> | id = <!--id image or text (image size should normally not exceed 90x45px)--> | id-a = <!--id horizontal alignment left/center/right/justify (default=center)--> | id-c = <!--id background color (default=#DDDDDD)--> | id-fc = <!--id font color (default=info-fc or black)--> | id-h = <!--id box height in pixels (default=45)--> | id-lh = <!--id line height (default=1.25em)--> | id-op = <!--id other CSS parameters--> | id-p = <!--id cell padding (default=0 1px 0 0)--> | id-s = <!--id text size in points (default=14)--> | id-w = <!--id box width in pixels (default=45)--> | info-class = <!--Adds an HTML class attribute to the "info" HTML table-row, to allow for styling, emission of microformats, etc.--> | info = <!--info text or image--> | info-a = <!--info horizontal alignment left/center/right/justify (default=left)--> | info-c = <!--info background color (default=#EEEEEE)--> | info-fc = <!--info font color (default=black)--> | info-lh = <!--info line height (default=1.25em)--> | info-op = <!--info other CSS parameters--> | info-p = <!--info padding (default=0 4px 0 4px)--> | info-s = <!--info text size in points (default=8)--> | nocat = <!--block page category declarations; see [[WP:NOCAT]] (default=false)--> | usercategory = <!--user category (optional, unlinked and without the "Category:" part)--> | usercategory2 = <!--user category (optional)--> | usercategory3 = <!--user category (optional)--> | usercategory4 = <!--user category (optional)--> | usercategory5 = <!--user category (optional)--> }} </syntaxhighlight> * All parameters are optional. * Images should normally be scaled to x45px or less. <!-- Explain what this template's parameters do -- if no params, delete the definition. --> Most HTML-based tables use only a handful of these attributes. The following subset can be used to quickly convert an HTML userbox into the format used here: <syntaxhighlight lang="wikitext"> {{userbox | border-c = | id = | id-c = | id-fc = | id-s = | info = | info-c = | info-fc = | info-lh = | info-s = }}</syntaxhighlight> == Examples == {| ! style="width: 300px;" | Code ! Result |- | <syntaxhighlight lang="wikitext">{{userbox | border-c = #aaffaa | border-s = 2 | id = foo | id-c = #ffffee | id-s = 20 | info = ''foo bar'' | info-c = #ffeeff | info-s = 12 }}</syntaxhighlight> || {{userbox|id=foo|id-s=20|id-c=#ffffee|info=''foo bar''|info-c=#ffeeff|info-s=12|border-c=#aaffaa|border-s=2}} |- | colspan="2"| Below example shows the default appearance of a userbox, which is (much) higher than the 45px.<br>Compare the height of the one below with the above userbox. |- | <syntaxhighlight lang="wikitext">{{userbox | border-c = #aaffaa | border-s = 2 | id = foo logo | id-c = #ffffee | info = ''We are trying to see default distance in between text lines, see the distance in between cell content and its border, and also see total height.'' | info-c = #ffeeff }}</syntaxhighlight> || {{userbox|id=foo logo|id-c=#ffffee|info=''We are trying to see default distance in between text lines, see the distance in between cell content and its border, and also see total height.''|info-c=#ffeeff|border-c=#aaffaa|border-s=2}} |- | colspan="2"| Below example shows how we can change that userbox and further specify parameters to bring down<br>the overall height of the userbox to the recommended height of 45px, even with four text lines.<br>Cell padding parameter "''info-p''" can also be set at "''1pt 1pt 1pt 2pt''", or "''1pt 2pt''" for better appearance,<br>when there are 4 text lines. |- | <syntaxhighlight lang="wikitext">{{userbox | border-c = #aaffaa | border-s = 1 | id = foo logo | id-c = #ffffee | id-lh = 1.1em | id-s = 14 | info = ''We have specified values to lessen the distance between text lines and padding space between cell content and its border.'' | info-c = #ffeeff | info-lh = 1.05em | info-p = 1pt | info-s = 8 }}</syntaxhighlight> || {{userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffffee|info=''We have specified values to lessen the distance between text lines and padding space between cell content and its border.''|info-c=#ffeeff|info-s=8|info-p=1pt|info-lh=1.05em|border-c=#aaffaa|border-s=1}} |- | colspan="2"| Below example is for advanced users, showing how we can specify other [[Cascading Style Sheets|CSS]] properties,for example, "''font-family''",<br>to change the font or "''text-decoration''" to add lines around the text. Below, on the right side are two userboxes:<br>the top one is displayed without either parameters; and the bottom userbox is displayed by using the below code,<br>with the help of the "''info-op''" field. |- | <syntaxhighlight lang="wikitext">{{userbox | border-c = #afa | border-s = 2 | id = foo logo | id-c = #ffe | id-lh = 1.1em | id-s = 14 | info = foo bar | info-c = #fef | info-op = font-family: 'Courier New', monospace; text-decoration: wavy overline green; | info-s = 14 }}</syntaxhighlight> || colspan="2"| {{Userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffe|info=foo bar|info-c=#fef|info-s=14|border-c=#afa|border-s=2}} <br style="clear:both">&#160;<br /> {{Userbox|id=foo logo|id-s=14|id-lh=1.1em|id-c=#ffe|info=foo bar|info-c=#fef|info-s=14|info-op=font-family: 'Courier New', monospace; text-decoration: wavy overline green;|border-c=#afa|border-s=2}} |} ==Microformats== ; bodyclass : This parameter is inserted into the "class" attribute for the userbox as a whole. ; info-class : This parameter is inserted into the "class" attribute for the info component. This template supports the addition of [[microformat]] information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. To flag a userbox as containing [[hCard]] information about a person, for example, add the following parameter: <syntaxhighlight lang="wikitext"> | bodyclass = vcard </syntaxhighlight> ''or'' <syntaxhighlight lang="wikitext"> | info-class = vcard </syntaxhighlight> ''then'' (for example): <syntaxhighlight lang="wikitext"><nowiki> | title = …the books of <span class="fn">[[Iain Banks]]</span> </nowiki></syntaxhighlight> ...and so forth. Examples include: * <code>{{tlu|User:UBX/Iain Banks}}</code> - person * {{tlx|User Microformats}} - group (WikiProject Microformats) * {{tlx|User Brum}} - place (Birmingham) See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia. == Template Data == {{TemplateData header}} <TemplateData>{ "description": "This template can be used to quickly create a userbox for display on a user's user page without having to know HTML or Wikitable syntax.", "params": { "bodyclass": { "label": "Body class", "description": "Adds an HTML class attribute to the entire template's HTML table, to allow for styling, emission of microformats, etc.", "type": "string", "required": false }, "border-c": { "label": "Border color", "description": "Color of the outer border", "type": "string", "default": "#999", "required": false, "aliases": [ "border-color" ] }, "border-s": { "label": "Border width", "description": "border width in pixels", "type": "number", "default": "1", "required": false, "aliases": [ "border-width" ] }, "float": { "label": "Float", "description": "left|right|none", "type": "string", "default": "left", "required": false, "suggestedvalues": [ "left", "right", "none" ] }, "id": { "label": "Logo", "description": "id image or text", "type": "content", "required": false, "aliases": [ "3", "logo" ], "suggested": true }, "id-a": { "label": "Logo content horizontal alignment", "description": "Horizontal alignment of logo content; left/center/right/justify", "type": "string", "default": "center", "required": false, "suggestedvalues": [ "left", "center", "right", "justify" ] }, "id-c": { "label": "id-c", "description": "Two-in-one alias for border color and logo background color. Lower priority than border-c and logo-background", "type": "string", "required": false, "aliases": [ "1" ], "example": "#d0d0d0" }, "id-fc": { "label": "Logo font color", "description": "Logo font color; if not specified, defaults to info font color", "type": "string", "default": "black", "required": false, "aliases": [ "logo-color" ] }, "id-h": { "label": "Logo height", "description": "Logo box height in pixels", "type": "number", "default": "45", "required": false, "aliases": [ "logo-height" ] }, "id-lh": { "label": "Logo line height", "description": "Logo line height", "type": "string", "default": "1.25em", "required": false, "aliases": [ "logo-line-height" ] }, "id-op": { "label": "Extra logo styling", "description": "Add additional arbitrary CSS styling to the logo", "type": "string", "required": false, "aliases": [ "logo-other-param" ], "example": "opacity: 0.25" }, "id-p": { "label": "Logo padding", "description": "Logo cell padding", "type": "string", "default": "0 1px 0 0", "required": false, "aliases": [ "logo-padding" ] }, "id-s": { "label": "Logo font size", "description": "Logo text size in points", "type": "string", "default": "14", "required": false, "aliases": [ "5", "logo-size" ] }, "id-w": { "label": "Logo width", "description": "id box width in pixels", "type": "number", "default": "45", "required": false, "aliases": [ "logo-width" ] }, "info-class": { "label": "Info CSS classes", "description": "Adds an HTML class attribute to the \"info\" HTML table-row, to allow for styling, emission of microformats, etc.", "type": "string", "required": false }, "info": { "label": "Info", "description": "info text or image", "type": "content", "required": true, "aliases": [ "4" ] }, "info-a": { "label": "Info content horizontal alignment", "description": "Horizontal alignment of info content; left/center/right/justify", "type": "string", "default": "left", "required": false, "suggestedvalues": [ "left", "center", "right", "justify" ] }, "info-c": { "label": "Info background color", "description": "Info background color", "type": "string", "default": "#e0e0e0", "required": false, "aliases": [ "2", "info-background" ] }, "info-fc": { "label": "Info font color", "description": "info font color", "type": "string", "default": "black", "required": false, "aliases": [ "info-color" ] }, "info-lh": { "label": "Info line height", "description": "Info line height", "type": "string", "default": "1.25em", "required": false, "aliases": [ "info-line-height" ] }, "info-op": { "label": "Extra info styling", "description": "Add additional arbitrary CSS styling to the info", "type": "string", "required": false, "aliases": [ "info-other-param" ], "example": "opacity: 0.25" }, "info-p": { "label": "Info padding", "description": "info padding", "type": "string", "default": "0 4px 0 4px", "required": false, "aliases": [ "info-padding" ] }, "info-s": { "label": "Info font size", "description": "info text size in points", "type": "number", "default": "8", "required": false, "aliases": [ "info-size" ] }, "nocat": { "label": "nocat", "description": "block page category declarations (see WP:NOCAT)", "type": "string", "default": "false", "required": false }, "usercategory": { "label": "usercategory", "description": "user category (optional)", "type": "string", "required": false }, "usercategory2": { "label": "usercategory2", "description": "user category (optional)", "type": "string", "required": false }, "usercategory3": { "label": "usercategory3", "description": "user category (optional)", "type": "string", "required": false }, "usercategory4": { "label": "usercategory4", "description": "user category (optional)", "type": "string", "required": false }, "usercategory5": { "label": "usercategory5", "description": "user category (optional)", "type": "string", "required": false }, "logo-background": { "label": "Logo background color", "description": "Background color of logo", "type": "string", "default": "#ddd" }, "id-class": { "label": "Logo CSS classes", "description": "CSS class or classes for the logo; optional", "type": "string", "default": "(none)" } }, "format": "block", "paramOrder": [ "bodyclass", "float", "border-c", "border-s", "id", "id-a", "logo-background", "id-c", "id-fc", "id-h", "id-s", "id-lh", "id-p", "id-w", "id-class", "id-op", "info", "info-a", "info-c", "info-fc", "info-lh", "info-p", "info-s", "info-class", "info-op", "nocat", "usercategory", "usercategory2", "usercategory3", "usercategory4", "usercategory5" ] }</TemplateData> ==See also== {{UBT}} <includeonly>{{Sandbox other|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Userboxes|*]] [[Category:User namespace templates]] [[Category:Wikipedia metatemplates]] }}</includeonly> 3b4eea4f8fc3ef69464386f3c3e9a0e08f76f0f6 Module:Userbox 828 148 166 2023-10-08T10:07:46Z Silentg 2 Created page with "-- This module implements {{userbox}}. local categoryHandler = require('Module:Category handler').main local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function checkNum(val, default) -- Checks whether a value is a number greater than or equal to zero. If so, -- returns it as a number. If not, returns a default valu..." Scribunto text/plain -- This module implements {{userbox}}. local categoryHandler = require('Module:Category handler').main local p = {} -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- local function checkNum(val, default) -- Checks whether a value is a number greater than or equal to zero. If so, -- returns it as a number. If not, returns a default value. val = tonumber(val) if val and val >= 0 then return val else return default end end local function addSuffix(num, suffix) -- Turns a number into a string and adds a suffix. if num then return tostring(num) .. suffix else return nil end end local function checkNumAndAddSuffix(num, default, suffix) -- Checks a value with checkNum and adds a suffix. num = checkNum(num, default) return addSuffix(num, suffix) end local function makeCat(cat, sort) -- Makes a category link. if sort then return mw.ustring.format('[[Category:%s|%s]]', cat, sort) else return mw.ustring.format('[[Category:%s]]', cat) end end -------------------------------------------------------------------------------- -- Argument processing -------------------------------------------------------------------------------- local function makeInvokeFunc(funcName) return function (frame) local origArgs = require('Module:Arguments').getArgs(frame) local args = {} for k, v in pairs(origArgs) do args[k] = v end return p.main(funcName, args) end end p.userbox = makeInvokeFunc('_userbox') p['userbox-2'] = makeInvokeFunc('_userbox-2') p['userbox-r'] = makeInvokeFunc('_userbox-r') -------------------------------------------------------------------------------- -- Main functions -------------------------------------------------------------------------------- function p.main(funcName, args) local userboxData = p[funcName](args) local userbox = p.render(userboxData) local cats = p.categories(args) return userbox .. (cats or '') end function p._userbox(args) -- Does argument processing for {{userbox}}. local data = {} -- Get div tag values. data.float = args.float or 'left' local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width. data.borderWidth = addSuffix(borderWidthNum, 'px') data.borderColor = args['border-color'] or args['border-c'] or args[1] or args['id-c'] or '#999' data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag. data.bodyClass = args.bodyclass -- Get table tag values. data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee' -- Get info values. data.info = args.info or args[4] or "<code>{{{info}}}</code>" data.infoTextAlign = args['info-a'] or 'left' data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt') data.infoHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px') data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px' data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em' data.infoColor = args['info-color'] or args['info-fc'] or 'black' data.infoOtherParams = args['info-other-param'] or args['info-op'] data.infoClass = args['info-class'] -- Get id values. local id = args.logo or args[3] or args.id data.id = id data.showId = id and true or false data.idWidth = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px') data.idHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px') data.idBackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd' data.idTextAlign = args['id-a'] or 'center' data.idFontSize = checkNum(args['logo-size'] or args[5] or args['id-s'], 14) data.idColor = args['logo-color'] or args['id-fc'] or data.infoColor data.idPadding = args['logo-padding'] or args['id-p'] or '0 1px 0 0' data.idLineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em' data.idOtherParams = args['logo-other-param'] or args['id-op'] data.idClass = args['id-class'] return data end p['_userbox-2'] = function (args) -- Does argument processing for {{userbox-2}}. local data = {} -- Get div tag values. data.float = args.float or 'left' local borderWidthNum = checkNum(args['border-s'] or args[9], 1) -- Used to calculate width. data.borderWidth = addSuffix(borderWidthNum, 'px') data.borderColor = args['border-c'] or args[6] or args['id1-c'] or args[1] or '#999999' data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag. data.bodyClass = args.bodyclass -- Get table tag values. data.backgroundColor = args['info-c'] or args[2] or '#eeeeee' -- Get info values. data.info = args.info or args[4] or "<code>{{{info}}}</code>" data.infoTextAlign = args['info-a'] or 'left' data.infoFontSize = checkNumAndAddSuffix(args['info-s'], 8, 'pt') data.infoColor = args['info-fc'] or args[8] or 'black' data.infoPadding = args['info-p'] or '0 4px 0 4px' data.infoLineHeight = args['info-lh'] or '1.25em' data.infoOtherParams = args['info-op'] -- Get id values. data.showId = true data.id = args.logo or args[3] or args.id1 or 'id1' data.idWidth = checkNumAndAddSuffix(args['id1-w'], 45, 'px') data.idHeight = checkNumAndAddSuffix(args['id-h'], 45, 'px') data.idBackgroundColor = args['id1-c'] or args[1] or '#dddddd' data.idTextAlign = 'center' data.idFontSize = checkNum(args['id1-s'], 14) data.idLineHeight = args['id1-lh'] or '1.25em' data.idColor = args['id1-fc'] or data.infoColor data.idPadding = args['id1-p'] or '0 1px 0 0' data.idOtherParams = args['id1-op'] -- Get id2 values. data.showId2 = true data.id2 = args.logo or args[5] or args.id2 or 'id2' data.id2Width = checkNumAndAddSuffix(args['id2-w'], 45, 'px') data.id2Height = data.idHeight data.id2BackgroundColor = args['id2-c'] or args[7] or args[1] or '#dddddd' data.id2TextAlign = 'center' data.id2FontSize = checkNum(args['id2-s'], 14) data.id2LineHeight = args['id2-lh'] or '1.25em' data.id2Color = args['id2-fc'] or data.infoColor data.id2Padding = args['id2-p'] or '0 0 0 1px' data.id2OtherParams = args['id2-op'] return data end p['_userbox-r'] = function (args) -- Does argument processing for {{userbox-r}}. local data = {} -- Get div tag values. data.float = args.float or 'left' local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width. data.borderWidth = addSuffix(borderWidthNum, 'px') data.borderColor = args['border-color'] or args['border-c'] or args[1] or args['id-c'] or '#999' data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag. data.bodyClass = args.bodyclass -- Get table tag values. data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee' -- Get id values. data.showId = false -- We only show id2 in userbox-r. -- Get info values. data.info = args.info or args[4] or "<code>{{{info}}}</code>" data.infoTextAlign = args['info-align'] or args['info-a'] or 'left' data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt') data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px' data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em' data.infoColor = args['info-color'] or args['info-fc'] or 'black' data.infoOtherParams = args['info-other-param'] or args['info-op'] -- Get id2 values. data.showId2 = true data.id2 = args.logo or args[3] or args.id or 'id' data.id2Width = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px') data.id2Height = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px') data.id2BackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd' data.id2TextAlign = args['id-a'] or 'center' data.id2FontSize = checkNum(args['logo-size'] or args[5] or args['id-s'], 14) data.id2Color = args['logo-color'] or args['id-fc'] or data.infoColor data.id2Padding = args['logo-padding'] or args['id-p'] or '0 0 0 1px' data.id2LineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em' data.id2OtherParams = args['logo-other-param'] or args['id-op'] return data end function p.render(data) -- Renders the userbox html using the content of the data table. -- Render the div tag html. local root = mw.html.create('div') root :css('float', data.float) :css('border', (data.borderWidth or '') .. ' solid ' .. (data.borderColor or '')) :css('margin', '1px') :css('width', data.width) :addClass('wikipediauserbox') :addClass(data.bodyClass) -- Render the table tag html. local tableroot = root:tag('table') tableroot :attr('role', 'presentation') :css('border-collapse', 'collapse') :css('width', data.width) :css('margin-bottom', '0') :css('margin-top', '0') :css('background', data.backgroundColor) -- Render the id html. local tablerow = tableroot:tag('tr') if data.showId then tablerow:tag('td') :css('border', '0') :css('width', data.idWidth) :css('height', data.idHeight) :css('background', data.idBackgroundColor) :css('text-align', data.idTextAlign) :css('font-size', data.idFontSize .. 'pt') :css('font-weight', 'bold') :css('color', data.idColor) :css('padding', data.idPadding) :css('line-height', data.idLineHeight) :css('vertical-align', 'middle') :cssText(data.idOtherParams) :addClass(data.idClass) :wikitext(data.id) end -- Render the info html. tablerow:tag('td') :css('border', '0') :css('text-align', data.infoTextAlign) :css('font-size', data.infoFontSize) :css('padding', data.infoPadding) :css('height', data.infoHeight) :css('line-height', data.infoLineHeight) :css('color', data.infoColor) :css('vertical-align', 'middle') :cssText(data.infoOtherParams) :addClass(data.infoClass) :wikitext(data.info) -- Render the second id html. if data.showId2 then tablerow:tag('td') :css('border', '0') :css('width', data.id2Width) :css('height', data.id2Height) :css('background', data.id2BackgroundColor) :css('text-align', data.id2TextAlign) :css('font-size', data.id2FontSize .. 'pt') :css('font-weight', 'bold') :css('color', data.id2Color) :css('padding', data.id2Padding) :css('line-height', data.id2LineHeight) :css('vertical-align', 'middle') :cssText(data.id2OtherParams) :wikitext(data.id2) end local title = mw.title.getCurrentTitle() if (title.namespace == 2) and not title.text:match("/") then return tostring(root) -- regular user page elseif title.namespace == 14 then return tostring(root) -- category elseif title.isTalkPage then return tostring(root) -- talk page end local legible = true local contrast = require('Module:Color contrast')._ratio local function has_text(wikitext) wikitext = wikitext:gsub("]]", "|]]") wikitext = wikitext:gsub("%[%[%s*[Mm][Ee][Dd][Ii][Aa]%s*:[^|]-(|.-)]]", "") wikitext = wikitext:gsub("%[%[%s*[Ii][Mm][Aa][Gg][Ee]%s*:[^|]-(|.-)]]", "") wikitext = wikitext:gsub("%[%[%s*[Ff][Ii][Ll][Ee]%s*:[^|]-(|.-)]]", "") return mw.text.trim(wikitext) ~= "" end if contrast { data.infoColor, data.backgroundColor, error = 0 } < 4.5 then legible = false end -- For bold text >= 14pt, requirement is only 3. local idContrastThreshold = 4.5 local id2ContrastThreshold = 4.5 if (data.idFontSize or 0) >= 14 then idContrastThreshold = 3 end if (data.id2FontSize or 0) >= 14 then id2ContrastThreshold = 3 end if data.showId and contrast { data.idColor, data.idBackgroundColor, error = 0 } < idContrastThreshold then if has_text(data.id or "") then legible = false end end if data.showId2 and contrast { data.id2Color, data.id2BackgroundColor, error = 0 } < id2ContrastThreshold then if has_text(data.id2 or "") then legible = false end end if not legible then root:wikitext('[[Category:Userboxes with insufficient color contrast]]') end return tostring(root) end function p.categories(args, page) -- Gets categories from [[Module:Category handler]]. -- The page parameter makes the function act as though the module was being called from that page. -- It is included for testing purposes. local cats = {} cats[#cats + 1] = args.usercategory cats[#cats + 1] = args.usercategory2 cats[#cats + 1] = args.usercategory3 cats[#cats + 1] = args.usercategory4 cats[#cats + 1] = args.usercategory5 -- Get the title object local title if page then title = mw.title.new(page) else title = mw.title.getCurrentTitle() end -- Build category handler arguments. local chargs = {} chargs.page = page chargs.nocat = args.nocat chargs.main = '[[Category:Pages with templates in the wrong namespace]]' if args.notcatsubpages then chargs.subpage = 'no' end -- User namespace. local user = '' for i, cat in ipairs(cats) do user = user .. makeCat(cat) end chargs.user = user -- Template namespace. local basepage = title.baseText local template = '' for i, cat in ipairs(cats) do template = template .. makeCat(cat, ' ' .. basepage) end chargs.template = template return categoryHandler(chargs) end return p 3afddd38f65cb302185911fa9957526a85855673 Module:Userbox/doc 828 149 167 2023-10-08T10:09:05Z Silentg 2 Created page with "{{High-use|233415}} {{Lua|Module:Category handler|Module:Arguments|Module:Color contrast}} This module does the processing for three userbox templates, {{tl|userbox}}, {{tl|userbox-2}} and {{tl|userbox-r}}. {| class="wikitable" |- ! Template ! Description ! Examples |- | {{tl|userbox}} | Makes userboxes with an id on the left-hand side, or with no id. | {{userbox|id=id}} {{clear}} {{userbox}} |- | {{tl|userbox-2}} | Makes userboxes with an id on both the left- and righ..." wikitext text/x-wiki {{High-use|233415}} {{Lua|Module:Category handler|Module:Arguments|Module:Color contrast}} This module does the processing for three userbox templates, {{tl|userbox}}, {{tl|userbox-2}} and {{tl|userbox-r}}. {| class="wikitable" |- ! Template ! Description ! Examples |- | {{tl|userbox}} | Makes userboxes with an id on the left-hand side, or with no id. | {{userbox|id=id}} {{clear}} {{userbox}} |- | {{tl|userbox-2}} | Makes userboxes with an id on both the left- and right-hand sides. | {{userbox-2}} |- | {{tl|userbox-r}} | Makes userboxes with an id on the right-hand side. | {{userbox-r}} |} To use any of these templates from a wiki page, please see the individual template pages for documentation. To generate userboxes directly from Lua, read on. == Generating userboxes from Lua == To generate a userbox directly from Lua, first load the module. <syntaxhighlight lang="lua"> local userbox = require('Module:Userbox') </syntaxhighlight> You can then run any of the three templates with the code: <syntaxhighlight lang="lua"> userbox.main(functionName, args) </syntaxhighlight> For {{tl|userbox}} use the function name "<code>_userbox</code>"; for {{tl|userbox-2}} use the function name "<code>_userbox-2</code>"; and for {{tl|userbox-r}} use the function name "<code>_userbox-r</code>". The <code>args</code> parameter is a table of arguments to pass to the different userbox functions. To see a list of valid arguments, please consult the individual template pages. == Tracking categories == * {{clc|Userboxes with insufficient color contrast}} * {{clc|Pages with templates in the wrong namespace}} 959aeab2b9a931fbb3e6f5906961bd851cc3921b Module:Color contrast 828 150 168 2023-10-08T10:10:46Z Silentg 2 Created page with "-- -- This module implements -- {{Color contrast ratio}} -- {{Greater color contrast ratio}} -- {{ColorToLum}} -- {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) local function sRGB (v) if (v <= 0.03928) then v = v / 12.92 else v = math.pow((v+0.055)/1.055, 2.4) end return v end local function rgbdec2lum(R, G, B) if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then return 0.2126 *..." Scribunto text/plain -- -- This module implements -- {{Color contrast ratio}} -- {{Greater color contrast ratio}} -- {{ColorToLum}} -- {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' ) local function sRGB (v) if (v <= 0.03928) then v = v / 12.92 else v = math.pow((v+0.055)/1.055, 2.4) end return v end local function rgbdec2lum(R, G, B) if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255) else return '' end end local function hsl2lum(h, s, l) if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then local c = (1 - math.abs(2*l - 1))*s local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) ) local m = l - c/2 local r, g, b = m, m, m if( 0 <= h and h < 60 ) then r = r + c g = g + x elseif( 60 <= h and h < 120 ) then r = r + x g = g + c elseif( 120 <= h and h < 180 ) then g = g + c b = b + x elseif( 180 <= h and h < 240 ) then g = g + x b = b + c elseif( 240 <= h and h < 300 ) then r = r + x b = b + c elseif( 300 <= h and h < 360 ) then r = r + c b = b + x end return rgbdec2lum(255*r, 255*g, 255*b) else return '' end end local function color2lum(c) if (c == nil) then return '' end -- html '#' entity c = c:gsub("&#35;", "#") -- whitespace c = c:match( '^%s*(.-)[%s;]*$' ) -- unstrip nowiki strip markers c = mw.text.unstripNoWiki(c) -- lowercase c = c:lower() -- first try to look it up local L = HTMLcolor[c] if (L ~= nil) then return L end -- convert from hsl if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$') return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100) end -- convert from rgb if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$') return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B)) end -- convert from rgb percent if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$') return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100) end -- remove leading # (if there is one) and whitespace c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$') -- split into rgb local cs = mw.text.split(c or '', '') if( #cs == 6 ) then local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2]) local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4]) local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6]) return rgbdec2lum(R, G, B) elseif ( #cs == 3 ) then local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1]) local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2]) local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3]) return rgbdec2lum(R, G, B) end -- failure, return blank return '' end -- This exports the function for use in other modules. -- The colour is passed as a string. function p._lum(color) return color2lum(color) end function p._greatercontrast(args) local bias = tonumber(args['bias'] or '0') or 0 local css = (args['css'] and args['css'] ~= '') and true or false local v1 = color2lum(args[1] or '') local c2 = args[2] or '#FFFFFF' local v2 = color2lum(c2) local c3 = args[3] or '#000000' local v3 = color2lum(c3) local ratio1 = -1; local ratio2 = -1; if (type(v1) == 'number' and type(v2) == 'number') then ratio1 = (v2 + 0.05)/(v1 + 0.05) ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1 end if (type(v1) == 'number' and type(v3) == 'number') then ratio2 = (v3 + 0.05)/(v1 + 0.05) ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2 end if css then local c1 = args[1] or '' if mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then c1 = '#' .. c1 end if mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then c2 = '#' .. c2 end if mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then c3 = '#' .. c3 end return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';' end return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '' end function p._ratio(args) local v1 = color2lum(args[1]) local v2 = color2lum(args[2]) if (type(v1) == 'number' and type(v2) == 'number') then -- v1 should be the brighter of the two. if v2 > v1 then v1, v2 = v2, v1 end return (v1 + 0.05)/(v2 + 0.05) else return args['error'] or '?' end end function p._styleratio(args) local style = (args[1] or ''):lower() local bg, fg = 'white', 'black' local lum_bg, lum_fg = 1, 0 if args[2] then local lum = color2lum(args[2]) if lum ~= '' then bg, lum_bg = args[2], lum end end if args[3] then local lum = color2lum(args[3]) if lum ~= '' then fg, lum_fg = args[3], lum end end local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '&#35;', '#'), ';') for k = 1,#slist do local s = slist[k] local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' ) k = k or '' v = v or '' if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then local lum = color2lum(v) if( lum ~= '' ) then bg, lum_bg = v, lum end elseif (k:match('^[%s]*(color)[%s]*$')) then local lum = color2lum(v) if( lum ~= '' ) then bg, lum_fg = v, lum end end end if lum_bg > lum_fg then return (lum_bg + 0.05)/(lum_fg + 0.05) else return (lum_fg + 0.05)/(lum_bg + 0.05) end end --[[ Use {{#invoke:Color contrast|somecolor}} directly or {{#invoke:Color contrast}} from a wrapper template. Parameters: -- |1= — required; A color to check. --]] function p.lum(frame) local color = frame.args[1] or frame:getParent().args[1] return p._lum(color) end function p.ratio(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._ratio(args) end function p.styleratio(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._styleratio(args) end function p.greatercontrast(frame) local args = frame.args[1] and frame.args or frame:getParent().args return p._greatercontrast(args) end return p 1e399769117591366a63f62996c9a407077cc711 Module:Color contrast/doc 828 151 169 2023-10-08T10:11:51Z Silentg 2 Created page with "<!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{module rating|protected}} {{High-use|325916}} {{Lua|Module:Color&nbsp;contrast/colors}} This module is used primarily by * {{tl|Color contrast ratio}} * {{tl|RGBColorToLum}} * {{tl|Color contrast conformance}} * {{tl|Ensure AAA contrast ratio}} * {{tl|Ensure AA contrast ratio}} * {{tl|Greater color contrast ratio}} It is also used for tracking within * [[Module:Navbox]] * Module:Userbo..." wikitext text/x-wiki <!-- Categories go at the bottom of this page and interwikis go in Wikidata. --> {{module rating|protected}} {{High-use|325916}} {{Lua|Module:Color&nbsp;contrast/colors}} This module is used primarily by * {{tl|Color contrast ratio}} * {{tl|RGBColorToLum}} * {{tl|Color contrast conformance}} * {{tl|Ensure AAA contrast ratio}} * {{tl|Ensure AA contrast ratio}} * {{tl|Greater color contrast ratio}} It is also used for tracking within * [[Module:Navbox]] * [[Module:Userbox]] * [[Module:Episode list]] and for documentation in * [[Module:College color]] The formulas used are [https://www.w3.org/WAI/GL/wiki/Relative_luminance#Definition_as_Stated_in_WCAG_2.x stated in WCAG 2.x specifications]. [[WCAG]] is the main guideline for creating accessible interfaces on the web. == Usage == To use this module, you may use one of the above listed templates or invoke the module directly * To compute relative luminescence: <br> <code><nowiki>{{ColorToLum|color}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|lum|color}}</nowiki></code> * To compute a contrast ratio between two colors: <br> <code><nowiki>{{Color contrast ratio|color1|color2|error=?}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|ratio|color1|color2|error=?}}</nowiki></code> * To determine which of two colors (color2a and color2b) has the greater contrast ratio with a particular color (color1): <br> <code><nowiki>{{Greater color contrast ratio|color1|color2a|color2b}}</nowiki></code> or <code><nowiki>{{#invoke:Color contrast|greatercontrast|color1|color2a|color2b}}</nowiki></code> * To compute the contrast ratio between the background and text colors specified in a css style string: <br> <code><nowiki>{{#invoke:Color contrast|styleratio|css style statement string|default background color|default text color}}</nowiki></code> <includeonly>{{sandbox other|| [[Category:Modules handling colors]] }}</includeonly> c0d7bb58633fe43eca934ce34030b5b21830b2d4 Module:Color contrast/colors 828 152 170 2023-10-08T10:12:12Z Silentg 2 Created page with "return { aliceblue = 0.92880068253475, antiquewhite = 0.84646951707754, aqua = 0.7874, aquamarine = 0.8078549208338, azure = 0.97265264954166, beige = 0.8988459998705, bisque = 0.80732327372979, black = 0, blanchedalmond = 0.85084439608156, blue = 0.0722, blueviolet = 0.12622014321946, brown = 0.098224287876511..." Scribunto text/plain return { aliceblue = 0.92880068253475, antiquewhite = 0.84646951707754, aqua = 0.7874, aquamarine = 0.8078549208338, azure = 0.97265264954166, beige = 0.8988459998705, bisque = 0.80732327372979, black = 0, blanchedalmond = 0.85084439608156, blue = 0.0722, blueviolet = 0.12622014321946, brown = 0.098224287876511, burlywood = 0.51559844533893, cadetblue = 0.29424681085422, chartreuse = 0.76032025902623, chocolate = 0.23898526114557, coral = 0.37017930872924, cornflowerblue = 0.30318641994179, cornsilk = 0.93562110372965, crimson = 0.16042199953026, cyan = 0.7874, darkblue = 0.018640801980939, darkcyan = 0.20329317839046, darkgoldenrod = 0.27264703559993, darkgray = 0.39675523072563, darkgreen = 0.091143429047575, darkgrey = 0.39675523072563, darkkhaki = 0.45747326349994, darkmagenta = 0.07353047651207, darkolivegreen = 0.12651920884889, darkorange = 0.40016167026524, darkorchid = 0.13413142174857, darkred = 0.054889674531132, darksalmon = 0.40541471563381, darkseagreen = 0.43789249325969, darkslateblue = 0.065792846227988, darkslategray = 0.067608151928044, darkslategrey = 0.067608151928044, darkturquoise = 0.4874606277449, darkviolet = 0.10999048339343, deeppink = 0.23866895828276, deepskyblue = 0.44481603395575, dimgray = 0.14126329114027, dimgrey = 0.14126329114027, dodgerblue = 0.27442536991456, firebrick = 0.10724525535015, floralwhite = 0.95922484825004, forestgreen = 0.18920812076002, fuchsia = 0.2848, gainsboro = 0.71569350050648, ghostwhite = 0.94311261886323, gold = 0.69860877428159, goldenrod = 0.41919977809569, gray = 0.2158605001139, green = 0.15438342968146, greenyellow = 0.80609472611453, grey = 0.2158605001139, honeydew = 0.96336535554782, hotpink = 0.34658438169715, indianred = 0.21406134963884, indigo = 0.03107561486337, ivory = 0.99071270600615, khaki = 0.77012343394121, lavender = 0.80318750514521, lavenderblush = 0.90172748631046, lawngreen = 0.73905893124963, lemonchiffon = 0.94038992245622, lightblue = 0.63709141280807, lightcoral = 0.35522120733135, lightcyan = 0.94587293494829, lightgoldenrodyellow = 0.93348351018297, lightgray = 0.65140563741982, lightgreen = 0.69091979956865, lightgrey = 0.65140563741982, lightpink = 0.58566152734898, lightsalmon = 0.4780675225206, lightseagreen = 0.35050145117042, lightskyblue = 0.56195637618331, lightslategray = 0.23830165007287, lightslategrey = 0.23830165007287, lightsteelblue = 0.53983888284666, lightyellow = 0.98161818392882, lime = 0.7152, limegreen = 0.44571042246098, linen = 0.88357340984379, magenta = 0.2848, maroon = 0.045891942324215, mediumaquamarine = 0.49389703310801, mediumblue = 0.044077780212328, mediumorchid = 0.21639251153773, mediumpurple = 0.22905858091648, mediumseagreen = 0.34393112338131, mediumslateblue = 0.20284629471622, mediumspringgreen = 0.70704308194184, mediumturquoise = 0.5133827926448, mediumvioletred = 0.14371899849357, midnightblue = 0.02071786635086, mintcream = 0.97834604947588, mistyrose = 0.82183047859185, moccasin = 0.80083000991567, navajowhite = 0.76519682342785, navy = 0.015585128108224, oldlace = 0.91900633405549, olive = 0.20027537200568, olivedrab = 0.22593150951929, orange = 0.4817026703631, orangered = 0.25516243753416, orchid = 0.31348806761439, palegoldenrod = 0.78792647887614, palegreen = 0.77936759006353, paleturquoise = 0.76436077921714, palevioletred = 0.28754994117889, papayawhip = 0.87797100199835, peachpuff = 0.74905589878251, peru = 0.30113074877936, pink = 0.63271070702466, plum = 0.45734221587969, powderblue = 0.68254586500605, purple = 0.061477070432439, rebeccapurple = 0.07492341159447, red = 0.2126, rosybrown = 0.32319457649407, royalblue = 0.16663210743188, saddlebrown = 0.097922285020521, salmon = 0.36977241527596, sandybrown = 0.46628543696283, seagreen = 0.19734199706275, seashell = 0.92737862206922, sienna = 0.13697631337098, silver = 0.52711512570581, skyblue = 0.55291668518184, slateblue = 0.14784278062136, slategray = 0.20896704076536, slategrey = 0.20896704076536, snow = 0.96533341834849, springgreen = 0.73052306068529, steelblue = 0.20562642207625, tan = 0.48237604163921, teal = 0.16996855778968, thistle = 0.56818401093733, tomato = 0.30638612719415, turquoise = 0.5895536427578, violet = 0.40315452986676, wheat = 0.74909702820482, white = 1, whitesmoke = 0.91309865179342, yellow = 0.9278, yellowgreen = 0.50762957208707, } 6ae47fdb24de4eed5ec26d203faf5341a388987b Module:Color contrast/colors/doc 828 153 171 2023-10-08T10:12:32Z Silentg 2 Created page with "{{High-use|327086}} {{Module rating |protected}} This module contains the [[relative luminance]] of [[HTML colors]]. It is used in [[Module:Color contrast]]." wikitext text/x-wiki {{High-use|327086}} {{Module rating |protected}} This module contains the [[relative luminance]] of [[HTML colors]]. It is used in [[Module:Color contrast]]. 4211178131e2a5d3ea62f08d00c83335be831544 Main Page 0 1 172 21 2023-10-08T10:45:41Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;max-width:74%"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> <p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:right;margin:0px 0px 0px 2px;width:25%"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p>shows transcluded news</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;clear:left;margin:2px 0px 0px 0px;max-width:50%"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> 2630727ea6eb0f3e27679744f75033928a552e4d 180 172 2023-10-09T13:47:47Z Silentg 2 wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <!-- Begin left column --> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> <p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;"> <div style="background-color:grey;;font-size:20px;text-align:center">Quick Start</div> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> </div> <!-- Begin right column --> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 0px 2px;width:100%;"> <div style="background-color:grey;font-size:20px;text-align:center">[[News]]</div> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> b71b62726f8e62f1d57e620c7cbdb4276973b66e 181 180 2023-10-10T04:01:01Z 2.50.172.28 0 -SIlentg, from school >v< wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <!-- Begin left column --> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> <p style="padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;"> <div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">Quick Start</div> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> </div> <!-- Begin right column --> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">Contribute</div> <p style="padding-left:3px;">Links to stuff to know when editing articles</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="background-color:grey;border-radius:5px;font-size:20px;margin:3px;text-align:center">[[News]]</div> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> ebdb2199b06776b2db4fc00feb842c985246516f 188 181 2023-10-12T15:20:54Z TBF wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <!-- Left column --> <div style="float:left;width:75%"> <!-- Main box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 2px 0px 0px;width:49%"> <div style="font-size:20px;text-align:center">Items</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:49%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;position:relative;width:49%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> </div> <!-- Right column --> <div style="float:right;width:25%"> <!-- Contribute box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <!-- News box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 3e4bb48355ebd3241d0469da3ab8d8b53082eb03 189 188 2023-10-12T16:09:55Z wikitext text/x-wiki <p style="text-align:center;font-size:30px">Welcome to the Abyssal Wiki!</p> <!-- Left column --> <div style="float:left;width:75%"> <!-- Main box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 2px 2px 0px;"> <p style="padding-left:3px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]].</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 2px 0px 0px;width:49%"> <div style="font-size:20px;text-align:center">Items</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:49%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;position:relative;width:49%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 0px;width:50%"> <div style="font-size:20px;text-align:center">Quick Start</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">New to the game? Here are a few pages that might be useful for you:</p> <ul> <li>[[Mechanics]]</li> <li>[[Echoes]]</li> <li>[[Characters]]</li> <li>[[Witnessess]]</li> <li>[[Locations]]</li> <li>[[Items]]</li> </ul> </div> </div> <!-- Right column --> <div style="float:right;width:25%"> <!-- Contribute box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <!-- News box --> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 019cf9e8ce5a750995a4fc5326b340453dab74c3 191 189 2023-10-14T16:23:49Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1"> <div style="font-size:20px;text-align:center">Lore</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;grid-row:1;"> <div style="font-size:20px;text-align:center">Locations</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">The Abyss is a beeg place.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 5d0800cae4b8e2fcd114a891ad0abd1a829a425f 192 191 2023-10-14T17:27:38Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 7ea1f247e1a2a3fd7271c2dddf194020396967ff 195 192 2023-10-15T04:30:39Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;max-width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 2c015f96e414417276522cc2b9e7ea55402222c0 196 195 2023-10-15T04:31:24Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;width:100%"> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:2;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> ded7ad6d7aa74225a6fd2fdb647ac9f4dda1095a 197 196 2023-10-15T04:38:27Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;grid-template-columns:50% 50%"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> bc4d6455cc7c99fdcee316584ed82c0f55d279f0 198 197 2023-10-15T04:40:20Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="display:grid;clear:left;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 878e3eb73c7ea37a8daf5f90039c423f62280408 199 198 2023-10-15T04:43:36Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 38c77a4db7ad2fb9bf6d217fd2e83800647ab9d8 200 199 2023-10-15T04:44:12Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 3dce40e380140d73777485aa14f0b51549c12c67 File:Masks.png 6 154 173 2023-10-08T15:56:53Z Reduckilous 4 wikitext text/x-wiki The template image for the Mask section(Temporary). cdeaf4962a7edf47a1b09d88bf825ed650845dbe File:Wings.png 6 155 174 2023-10-08T16:01:34Z Reduckilous 4 wikitext text/x-wiki Template image for the Wings page(Temporary). 4ce2af0a8829ac2f3704461d3c5548c09062bfe3 File:Dyes.png 6 156 175 2023-10-08T16:06:22Z Reduckilous 4 wikitext text/x-wiki Template image for the Dye page(Temporary). 10f51ed80701810e6548351fa9414445cd4c0024 Items 0 157 176 2023-10-08T16:09:09Z Reduckilous 4 Created page with "There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. [[File:Masks.png|frame|[[Masks]]]] [[File:Wings.png|frame|[[Wings]]]] [[File:Dyes.png|frame|[[Dyes]]]]" wikitext text/x-wiki There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. [[File:Masks.png|frame|[[Masks]]]] [[File:Wings.png|frame|[[Wings]]]] [[File:Dyes.png|frame|[[Dyes]]]] ae767139d13c84ceea2ae2564d58e92fd39100f8 177 176 2023-10-08T16:12:32Z Reduckilous 4 wikitext text/x-wiki There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. [[File:Masks.png|frame|100px|[[Masks]]]] [[File:Wings.png|frame|100px|[[Wings]]]] [[File:Dyes.png|frame|100px|[[Dyes]]]] 8332bd099a8179231c8f27a612af83e2c1cc361c 178 177 2023-10-08T17:03:58Z Reduckilous 4 wikitext text/x-wiki There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. [[File:Masks.png|150px|left|thumb|[[Masks]]]] [[File:Wings.png|150px|left|thumb|[[Wings]]]] [[File:Dyes.png|150px|left|thumb|[[Dyes]]]] 1b2dcd6918d7fc4e48bbc1f9f5b322b0078462aa 179 178 2023-10-09T02:27:34Z Reduckilous 4 wikitext text/x-wiki There are 3 types of collectable items in the game as of currently, Horns and other accessories are said to be added later in the game. <div style="display: flex"> [[File:Masks.png|150px|left|thumb|[[Masks]]]] [[File:Wings.png|150px|left|thumb|[[Wings]]]] [[File:Dyes.png|150px|left|thumb|[[Dyes]]]] </div> 757658693eafaf0090ef1d4d04e82e5b81bd1b84 File:Locations.png 6 158 182 2023-10-10T11:31:08Z Reduckilous 4 Icon for the Locations section(Temporary). wikitext text/x-wiki == Summary == Icon for the Locations section(Temporary). ea013cb7487ea0fd71d9487a1f3d06c19ea02720 File:Echoes.png 6 159 183 2023-10-10T11:33:34Z Reduckilous 4 Icon for the echo section(temporary) wikitext text/x-wiki == Summary == Icon for the echo section(temporary) f4aa3b2f9f87f97f6378131b23b7d3bfe7cdda02 File:NPC.png 6 160 184 2023-10-10T11:46:26Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Mechanics.png 6 161 185 2023-10-10T11:47:26Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Item.png 6 162 186 2023-10-10T11:48:41Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Witness.png 6 163 187 2023-10-10T12:57:36Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 MediaWiki:Sidebar 8 164 190 2023-10-13T16:55:51Z Silentg 2 Created page with " * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage * SEARCH * TOOLBOX * LANGUAGES" wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage * SEARCH * TOOLBOX * LANGUAGES 48f48a2887a6e5e7a6b5c92e90467ac3661e0858 File:Placeholder.png 6 165 193 2023-10-14T18:01:09Z Reduckilous 4 Replace the default placefolder image wikitext text/x-wiki == Summary == Replace the default placefolder image 482d11c9bbd775ade0d46cfbb3515681036580b8 File:No-image.png 6 166 194 2023-10-14T18:02:59Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Main Page 0 1 201 200 2023-10-15T04:45:19Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> d1bf22b29ac6dff056059a9f6f5980bacc5d53fa 204 201 2023-10-15T10:47:39Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> <div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto"> <div style="padding-left:3px;">[[Editing guidelines]]</div> <div style="padding-left:3px;">[[Wanted pages]]</div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 07a1e7aef385c5819b941620429aa17e8c4eed14 205 204 2023-10-16T14:31:32Z Silentg 2 wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin-bottom:2px;"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;"> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> <div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto"> <div style="padding-left:3px;">[[Editing guidelines]]</div> <div style="padding-left:3px;">[[Wanted pages]]</div> <div style="padding-left:3px;">[[Wanted templates]]</div> </div> </div> <div style="border-radius:5px;border-style:solid;border-width:1px;float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 669a5489e97ea1333d316edb4447dfd1079cdb52 209 205 2023-10-16T14:50:03Z Silentg 2 Slight decluttering wikitext text/x-wiki <p style="font-size:30px;text-align:center;">Welcome to the Abyssal Wiki!</p> <div style="float:left;width:75%"> <div class="mp-box" id="mp-LeadBox"> <p style="padding:0px 2px;">[https://www.roblox.com/games/14418473444/Abyssal-Co-op-Obby Abyssal] is a [[wikipedia:Roblox|Roblox]] cooperative obby game developed by [[nextReality Studios]]. It is set in the Abyss, where long ago</p> </div> <div style="clear:left;display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto;margin-right:2px;"> <div class="mp-box"> <div style="font-size:20px;text-align:center">Gameplay</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">These are the core aspects of the gameplay, aside from the platforming.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Mechanics.png|75px|link=[[Mechanics]]]]<div style="clear:none;text-align:center">[[Mechanics]]</div></div> <div style="margin:5px">[[File:Echoes.png|75px|link=[[Echoes]]]]<div style="clear:none;text-align:center;">[[Echoes]]</div></div> <div style="margin:5px">[[File:Witness.png|75px|link=[[Witnesses]]]]<div style="clear:none;text-align:center;">[[Witnesses]]</div></div> </div> </div> <div class="mp-box"> <div style="font-size:20px;text-align:center">Cosmetics</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;">There are 3 types of cosmetics in the game which change the appearance of the abyss walker. These changes are purely visual.</p> <div style="align-items:center;display:flex;flex-wrap:wrap;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:Masks.png|75px|link=[[Masks]]]]<div style="clear:none;text-align:center">[[Masks]]</div></div> <div style="margin:5px">[[File:Wings.png|75px|link=[[Wings]]]]<div style="clear:none;text-align:center">[[Wings]]</div></div> <div style="margin:5px">[[File:Dyes.png|75px|link=[[Dyes]]]]<div style="clear:none;text-align:center">[[Dyes]]</div></div> </div> </div> <div class="mp-box" style="grid-column:1 / span 2;"> <div style="font-size:20px;text-align:center">World</div> <hr style="margin:0px 5px"> <p style="padding-left:3px;"></p> <div style="align-items:center;display:flex;justify-content:center;margin:5px;"> <div style="margin:5px">[[File:NPC.png|75px|link=[[Characters]]]]<div style="clear:none;text-align:center">[[Characters]]</div></div> <div style="margin:5px">[[File:Locations.png|75px|link=[[Locations]]]]<div style="clear:none;text-align:center">[[Locations]]</div></div> </div> </div> </div> </div> <div style="float:right;width:25%"> <div class="mp-box" style="float:left;margin:0px 0px 2px 2px;width:100%;"> <div style="font-size:20px;text-align:center">Contribute</div> <hr style="margin:0px 5px"> <p style="font-size:11px;padding-left:3px;">This wiki aims to serve as a comprehensive encylopedia and guide to all aspects of the game. There are currently {{NUMBEROFARTICLES}} articles on the wiki. It is currently under heavy construction, help us by contributing today!</p> <div style="display:grid;gap:2px;grid-template-columns:50% 50%;grid-template-rows:auto auto"> <div style="padding-left:3px;">[[Editing guidelines]]</div> <div style="padding-left:3px;">[[Wanted pages]]</div> <div style="padding-left:3px;">[[Wanted templates]]</div> </div> </div> <div class="mp-box" style="float:left;margin:2px 0px 0px 2px;width:100%;"> <div style="font-size:20px;text-align:center">News</div> <hr style="margin:0px 5px"> <p style="padding-left:10px;"><b>Game news</b></p> <p style="padding-left:10px;"><b>nextReality news</b></p> <p style="padding-left:10px;"><b>Wiki news</b></p> </div> </div> 4e973b8261fdda67bda41fef68562ee148de2aea Abyssal Wiki:About 4 167 202 2023-10-15T05:16:54Z Silentg 2 Created page with "Abyssal Wiki is dedicated to being the most reliable source of information for the Roblox game Abyssal developed by nextReality Games." wikitext text/x-wiki Abyssal Wiki is dedicated to being the most reliable source of information for the Roblox game Abyssal developed by nextReality Games. 2293f34836ac223c56490f7413ea6a1de8d9db89 MediaWiki:Common.css 8 140 206 158 2023-10-16T14:39:14Z Silentg 2 css text/css /* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } /* Main Page styles */ .mp-box { border-radius:5px; border-style:solid; border-width:1px; } c3be168fdff55fcf7fd4fc8c0fb8ea7d8397b8f1 207 206 2023-10-16T14:40:07Z Silentg 2 css text/css /* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } /* Main Page styles */ .mp-box { border-radius: 5px; border-style: solid; border-width: 1px; } e2cbc897dbbb898d8c7c950f3de6ffafc3206f76 208 207 2023-10-16T14:45:38Z Silentg 2 css text/css /* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } /* Main Page styles */ .mp-box { border-radius: 5px; border-style: solid; border-width: 1px; } #mp-LeadBox { float: left; margin-bottom: 2px; } 13cd531e739db25f34450d5cd83742bfad04f204 210 208 2023-10-16T14:52:51Z Silentg 2 Protected "[[MediaWiki:Common.css]]": Could mess up a lot of things if anyone could edit this ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) css text/css /* CSS placed here will be applied to all skins */ /* vvv Move to TemplateStyles when WP does vvv */ /* Infobox template style */ .infobox { border: 1px solid #a2a9b1; border-spacing: 3px; background-color: #f8f9fa; color: black; /* @noflip */ margin: 0.5em 0 0.5em 1em; padding: 0.2em; /* @noflip */ float: right; /* @noflip */ clear: right; font-size: 88%; line-height: 1.5em; width: 22em; } .infobox-header, .infobox-label, .infobox-above, .infobox-full-data, .infobox-data, .infobox-below, .infobox-subheader, .infobox-image, .infobox-navbar, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { vertical-align: top; } .infobox-label, .infobox-data, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox th, .infobox td { /* @noflip */ text-align: left; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-above, .infobox .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { font-size: 125%; font-weight: bold; text-align: center; } .infobox-title, /* Remove element selector when every .infobox thing is using the standard module/templates */ .infobox caption { padding: 0.2em; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-header, .infobox .infobox-subheader, .infobox .infobox-image, .infobox .infobox-full-data, .infobox .infobox-below { text-align: center; } /* Remove .infobox when element selectors above are removed */ .infobox .infobox-navbar { /* @noflip */ text-align: right; } /* Main Page styles */ .mp-box { border-radius: 5px; border-style: solid; border-width: 1px; } #mp-LeadBox { float: left; margin-bottom: 2px; } 13cd531e739db25f34450d5cd83742bfad04f204 Masks 0 169 211 2023-10-25T12:20:45Z Reduckilous 4 Created page with "<h1> Masks </h1> <p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico mask.(Add more to this part)</p> <h2> Seasonal masks </h2> <table class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; color: #FFFFF5;"> <tr> <th style="background-color: #3472AD; Width:13% ">Name</th> <th styl..." wikitext text/x-wiki <h1> Masks </h1> <p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico mask.(Add more to this part)</p> <h2> Seasonal masks </h2> <table class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; color: #FFFFF5;"> <tr> <th style="background-color: #3472AD; Width:13% ">Name</th> <th style="background-color: #3472AD; Width:12% ">Appearence</th> <th style="background-color: #3472AD ">Location</th> <th style="background-color: #3472AD; Width:10% ">Height</th> <th style="background-color: #3472AD; Width:15% ">Difficulty</th> </tr> <tr> <td>[[Jack O’ Lantern Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Owl Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Owl Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Moonlight Pico Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Moonlight Pico Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Ghost Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Ghost Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Creepy Smile Crest Mask]]</td> <td>[[File:Placeholder.png|100px|[[link=Creepy Smile Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Evil Eye Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Evil Eye Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> <tr> <td>[[Skull Crest Mask]]</td> <td>[[File:Placeholder.png|100px|link=[[Skull Crest Mask]]]]</td> <td>t</td> <td>t</td> <td>t</td> </tr> </table> 8b371b0f7d6ab9598b8e541a332d25e236b49b95 219 211 2023-10-25T17:45:34Z Reduckilous 4 wikitext text/x-wiki <h1> Masks </h1> <p>Masks are the most common collectable in the games, with most mask being either a founding family icon, or being a Pico mask.(Add more to this part)</p> <h2> Seasonal masks </h2> <table class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; text-align: center; color: #FFFFF5;"> <tr> <th style="background-color: #3472AD; Width:13% ">Name</th> <th style="background-color: #3472AD; Width:12% ">Appearence</th> <th style="background-color: #3472AD ">Location</th> <th style="background-color: #3472AD; Width:10% ">Height</th> <th style="background-color: #3472AD; Width:15% ">Difficulty</th> </tr> <tr> <td>[[Jack O’ Lantern Crest Mask]]</td> <td>[[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]]</td> <td> <ul> <li>Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]].</li> <li>Can be obtained the quickest by falling down the bridge near [[Witness Store]].</li> </ul> </td> <td>19</td> <td>Easy</td> </tr> <tr> <td>[[Owl Crest Mask]]</td> <td>[[File:Owl1.png|100px|link=[[Owl Crest Mask]]]]</td> <td> Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. </td> <td>63</td> <td>Easy</td> </tr> <tr> <td>[[Moonlight Pico Mask]]</td> <td>[[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]]</td> <td> <ul> <li>Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well.</li> <li>Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down.</li></ul> </td> <td>312</td> <td>Medium</td> </tr> <tr> <td>[[Ghost Crest Mask]]</td> <td>[[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]]</td> <td>Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down.</td> <td>783</td> <td>Easy</td> </tr> <tr> <td>[[Creepy Smile Crest Mask]]</td> <td>[[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]]</td> <td> <ul> <li>Located directly above [[Bridge of Connection]].</li><li>Can be reached from falling near [[Refinery Overlook]].</li></ul> </td> <td>805</td> <td>Medium</td> </tr> <tr> <td>[[Evil Eye Crest Mask]]</td> <td>[[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]]</td> <td>Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]].</td> <td>1040</td> <td>Easy</td> </tr> <tr> <td>[[Skull Crest Mask]]</td> <td>[[File:Skull1.png|100px|link=[[Skull Crest Mask]]]]</td> <td> <ul> <li>Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]].</li> <li>Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally.</li></ul> </td> <td>1175</td> <td>Easy</td> </tr> </table> 77fe38fb9ed2b3bc02d7b216a4dce7d2e14c5ce2 220 219 2023-10-27T02:31:54Z Reduckilous 4 wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border: 1px solid; border-color: #E0E28D; border-collapse: collapse; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks |- !style="background-color:#3472AD; Width:13%"| Name !style="background-color:#3472AD; Width:12%"| Appearance !style="background-color:#3472AD"|Location !style="background-color:#3472AD; Width:10%"| Height !style="background-color:#3472AD; Width:15%"| Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ae182fc274f9bdd1c3c5a6d5ac5b1708c7ecd70c 221 220 2023-10-27T02:49:35Z Reduckilous 4 wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} 84c8aecda1596e55b9851167b51e71c7e61c4087 File:Skull Crest Mask.png 6 170 212 2023-10-25T17:37:10Z Reduckilous 4 skull mask wikitext text/x-wiki == Summary == skull mask 83f55f9eb1655f82633575c3d1cfd766b4777a0c 227 212 2023-10-27T12:57:34Z Reduckilous 4 Reduckilous moved page [[File:Skull1.png]] to [[File:Skull Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == skull mask 83f55f9eb1655f82633575c3d1cfd766b4777a0c File:Jack O’ Lantern Crest Mask.png 6 171 213 2023-10-25T17:40:44Z Reduckilous 4 jacko mask wikitext text/x-wiki == Summary == jacko mask d4deee995f959afe4939be8acadacdbca2e42751 243 213 2023-10-27T13:14:45Z Reduckilous 4 Reduckilous moved page [[File:Jacko1.png]] to [[File:Jack O’ Lantern Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == jacko mask d4deee995f959afe4939be8acadacdbca2e42751 File:Owl Crest Mask.png 6 172 214 2023-10-25T17:41:44Z Reduckilous 4 owl mask wikitext text/x-wiki == Summary == owl mask d17a96ecea615ec65580ce45936502c8dd15ceb5 241 214 2023-10-27T13:13:16Z Reduckilous 4 Reduckilous moved page [[File:Owl1.png]] to [[File:Owl Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == owl mask d17a96ecea615ec65580ce45936502c8dd15ceb5 File:Moonlight Pico Mask.png 6 173 215 2023-10-25T17:42:30Z Reduckilous 4 Pico mask halloween wikitext text/x-wiki == Summary == Pico mask halloween 9f293091042fcef98544c12cb68fe7c0a25f2fd0 239 215 2023-10-27T13:12:20Z Reduckilous 4 Reduckilous moved page [[File:Moonlightpico1.png]] to [[File:Moonlight Pico Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == Pico mask halloween 9f293091042fcef98544c12cb68fe7c0a25f2fd0 File:Creepy Smile Crest Mask.png 6 174 216 2023-10-25T17:43:35Z Reduckilous 4 Creepysmile mask wikitext text/x-wiki == Summary == Creepysmile mask e8f979ff8290fcc0354baa3ada8be49fe15ca353 237 216 2023-10-27T13:11:32Z Reduckilous 4 Reduckilous moved page [[File:Creepysmile1.png]] to [[File:Creepy Smile Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == Creepysmile mask e8f979ff8290fcc0354baa3ada8be49fe15ca353 File:Ghost Crest Mask.png 6 175 217 2023-10-25T17:44:23Z Reduckilous 4 pacman ghost mask wikitext text/x-wiki == Summary == pacman ghost mask 14f680cf06bdc1b2b02c01795887d2adfda4877e 235 217 2023-10-27T13:10:18Z Reduckilous 4 Reduckilous moved page [[File:Ghost1.png]] to [[File:Ghost Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == pacman ghost mask 14f680cf06bdc1b2b02c01795887d2adfda4877e File:Evil Eye Crest Mask.png 6 176 218 2023-10-25T17:44:58Z Reduckilous 4 evileye(according to lux) mask wikitext text/x-wiki == Summary == evileye(according to lux) mask b93ceb3d0f4ad404aa32ff8479d4d5106daaca1c 233 218 2023-10-27T13:02:45Z Reduckilous 4 Reduckilous moved page [[File:EvilEye1.png]] to [[File:Evil Eye Crest Mask.png]]: Misspelled title wikitext text/x-wiki == Summary == evileye(according to lux) mask b93ceb3d0f4ad404aa32ff8479d4d5106daaca1c File:Jack O’ Lantern Crest Mask Location.png 6 177 222 2023-10-27T03:11:51Z Reduckilous 4 Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask. wikitext text/x-wiki == Summary == Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask. b3151878e2d443e3e3d9672c5b406620c96ab425 231 222 2023-10-27T12:59:12Z Reduckilous 4 Reduckilous moved page [[File:Jacko Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Surroundings.png]]: Misspelled title wikitext text/x-wiki == Summary == Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask. b3151878e2d443e3e3d9672c5b406620c96ab425 245 231 2023-10-27T13:19:18Z Reduckilous 4 Reduckilous moved page [[File:Jack O’ Lantern Crest Mask Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Location.png]]: Misspelled title wikitext text/x-wiki == Summary == Showcasing of the surrounding of the location of the Jacko Lantern Crest Mask. b3151878e2d443e3e3d9672c5b406620c96ab425 File:Jack O’ Lantern Crest Mask Icon.png 6 178 223 2023-10-27T03:25:06Z Reduckilous 4 The Jacko Lantern crest Mask's ingame icon wikitext text/x-wiki == Summary == The Jacko Lantern crest Mask's ingame icon f3092d590853dc5fe3d33d249de1bde75b85b965 225 223 2023-10-27T12:54:46Z Reduckilous 4 Reduckilous moved page [[File:Jacko Icon.png]] to [[File:Jack O’ Lantern Crest Mask Icon.png]]: Misspelled title wikitext text/x-wiki == Summary == The Jacko Lantern crest Mask's ingame icon f3092d590853dc5fe3d33d249de1bde75b85b965 File:Jack O’ Lantern Crest Mask Showcase.png 6 179 224 2023-10-27T03:27:04Z Reduckilous 4 Showcasing the Jacko Lantern crest mask in the orange dye. wikitext text/x-wiki == Summary == Showcasing the Jacko Lantern crest mask in the orange dye. f40f182f3f16762dd6653ea835e7f89ea9fde8f6 229 224 2023-10-27T12:58:33Z Reduckilous 4 Reduckilous moved page [[File:Jacko Showcase.png]] to [[File:Jack O’ Lantern Crest Mask Showcase.png]]: Misspelled title wikitext text/x-wiki == Summary == Showcasing the Jacko Lantern crest mask in the orange dye. f40f182f3f16762dd6653ea835e7f89ea9fde8f6 File:Jacko Icon.png 6 180 226 2023-10-27T12:54:46Z Reduckilous 4 Reduckilous moved page [[File:Jacko Icon.png]] to [[File:Jack O’ Lantern Crest Mask Icon.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Jack O’ Lantern Crest Mask Icon.png]] b55d55c0babd218cb44eca8dbabf5fee5fffffcf File:Skull1.png 6 181 228 2023-10-27T12:57:35Z Reduckilous 4 Reduckilous moved page [[File:Skull1.png]] to [[File:Skull Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Skull Crest Mask.png]] 621f6246b6470a9e4656b258c841183ded883be1 File:Jacko Showcase.png 6 182 230 2023-10-27T12:58:34Z Reduckilous 4 Reduckilous moved page [[File:Jacko Showcase.png]] to [[File:Jack O’ Lantern Crest Mask Showcase.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Jack O’ Lantern Crest Mask Showcase.png]] dc8a5379e268c4486e950bc8e01558d30f9da72c File:Jacko Surroundings.png 6 183 232 2023-10-27T12:59:12Z Reduckilous 4 Reduckilous moved page [[File:Jacko Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Surroundings.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Jack O’ Lantern Crest Mask Surroundings.png]] 556a537bfb30928a58997a558ecbd96bbeea2045 File:EvilEye1.png 6 184 234 2023-10-27T13:02:45Z Reduckilous 4 Reduckilous moved page [[File:EvilEye1.png]] to [[File:Evil Eye Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Evil Eye Crest Mask.png]] eae420c0aed6c38b2a132b972afd2b744d370191 File:Ghost1.png 6 185 236 2023-10-27T13:10:18Z Reduckilous 4 Reduckilous moved page [[File:Ghost1.png]] to [[File:Ghost Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Ghost Crest Mask.png]] e222bec269e7b9527d2cc2a89d6d037498d68634 File:Creepysmile1.png 6 186 238 2023-10-27T13:11:32Z Reduckilous 4 Reduckilous moved page [[File:Creepysmile1.png]] to [[File:Creepy Smile Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Creepy Smile Crest Mask.png]] 282e6c7a3f590dc92c1d4bfe4ca9c0c4ba80f3f5 File:Moonlightpico1.png 6 187 240 2023-10-27T13:12:20Z Reduckilous 4 Reduckilous moved page [[File:Moonlightpico1.png]] to [[File:Moonlight Pico Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Moonlight Pico Mask.png]] 53878c02c849cce4736bf6a48f9e90eea3b7ceb4 File:Owl1.png 6 188 242 2023-10-27T13:13:16Z Reduckilous 4 Reduckilous moved page [[File:Owl1.png]] to [[File:Owl Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Owl Crest Mask.png]] 8627f72cf34b1d4b4cf76c42ed8a38574f7fbf13 File:Jacko1.png 6 189 244 2023-10-27T13:14:45Z Reduckilous 4 Reduckilous moved page [[File:Jacko1.png]] to [[File:Jack O’ Lantern Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Jack O’ Lantern Crest Mask.png]] 85b1362aa59d1187a21631cacc61a48f3ad8ad2e File:Jack O’ Lantern Crest Mask Surroundings.png 6 190 246 2023-10-27T13:19:18Z Reduckilous 4 Reduckilous moved page [[File:Jack O’ Lantern Crest Mask Surroundings.png]] to [[File:Jack O’ Lantern Crest Mask Location.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Jack O’ Lantern Crest Mask Location.png]] 77707e1cf600715b25ff0a3ff838d642d3f31014 Jack O’ Lantern Crest Mask 0 191 247 2023-10-27T17:40:13Z Reduckilous 4 Created page with "{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Jack O’ Lantern Crest Mask | name = Jack O’ Lantern Crest Mask | image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]] | label1 = In-Game Description | data1 = A mask bearing a festive face that fills you with a fondness for sweets. }} <h2>'''Appearance'''</h2> The Appearance of the mask is inverted compared to..." wikitext text/x-wiki {{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Jack O’ Lantern Crest Mask | name = Jack O’ Lantern Crest Mask | image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]] | label1 = In-Game Description | data1 = A mask bearing a festive face that fills you with a fondness for sweets. }} <h2>'''Appearance'''</h2> The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Jack O’ Lantern Crest Mask resemblance a normal Jack O’ Lantern, having a jagged mouth, a triangle shaped nose but have a circle shaped eye, unlike traditional Halloweens pumpkin face whereas the eyes are triangles. <h2>'''Location'''</h2> *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]]. *To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it. *You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate. *You can fall down from the bridge before [[Witness Store]] to directly land on the item. <h2>'''Showcase'''</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Jack O’ Lantern Crest Mask.png| The actual appearance of the mask Jack O’ Lantern Crest Mask Location.png| The surrounding of the location of the mask Jack O’ Lantern Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask </gallery> <h2>'''Trivia'''</h2> There is, in fact, no lore to this mask. This have been confirmed, despite having such a description. 17bf3a9936491b1c84645949797e091ce5ea487d 248 247 2023-10-28T14:14:19Z Reduckilous 4 wikitext text/x-wiki {{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Jack O’ Lantern Crest Mask | name = Jack O’ Lantern Crest Mask | image = [[File:Jack O’ Lantern Crest Mask Icon.png|250px]] | label1 = In-Game Description | data1 = A mask bearing a festive face that fills you with a fondness for sweets. | label2 = Location | data2 = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]] | label3 = Price | data3 = 400 AE }} The Jack O' Lantern Crest Mask is one of the 7 Halloween mask released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players. <h2>Appearance</h2> The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Jack O’ Lantern Crest Mask resemblance a normal Jack O’ Lantern, having a jagged mouth, a triangle shaped nose but have a circle shaped eye, unlike traditional Halloweens pumpkin face whereas the eyes are triangles. <h2>Location</h2> *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]]. *To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it. *You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate. *You can fall down from the bridge before [[Witness Store]] to directly land on the item. <h2>Showcase</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Jack O’ Lantern Crest Mask.png| The actual appearance of the mask Jack O’ Lantern Crest Mask Location.png| The surrounding of the location of the mask Jack O’ Lantern Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask </gallery> <h2>Trivia</h2> There is, in fact, no lore to this mask. This have been confirmed, despite having such a description. 2299cafd4442fd446ba8031307ac7c1d2af7493b Template:Mask 10 192 249 2023-10-28T15:31:12Z Silentg 2 Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ## Appearance {{{appearance|}}} ## Location {{{loca..." wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ## Appearance {{{appearance|}}} ## Location {{{location|}}} {{#if:{{{gallery|}}}|## Gallery <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}|## Trivia {{{trivia|}}}|}}</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> d20d8a7843fc9d0c34a53ac56b5bc91177b5d52b 250 249 2023-10-28T15:34:29Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ## Appearance {{{appearance|}}} ## Location {{{location|}}} {{#if:{{{gallery|}}}|## Gallery <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}|## Trivia {{{trivia|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> fda158be65f142d7d65bf6b2f7ee49b3d734ef4e File:Owl Crest Mask Icon.png 6 193 251 2023-10-28T15:37:59Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Template:Mask 10 192 252 250 2023-10-28T15:38:15Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ## Appearance {{{appearance|}}} ## Location {{{location|}}} {{#if:{{{gallery|}}}|## Gallery <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}|## Trivia {{{trivia|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> 8d2e0424347c9ee65c0dbc7045c2685e1b17cd96 255 252 2023-10-28T15:39:49Z Silentg 2 It's been a while wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|==Gallery== <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}|==Trivia== {{{trivia|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> cb00a6287e78764c5b508835ac1dbcde8f7cc632 257 255 2023-10-28T15:47:15Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|==Gallery== <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}| ==Trivia== {{{trivia|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> 2defb750871e746a8dd94009c6f3f6c7f0498c30 258 257 2023-10-28T15:48:38Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|==Gallery== <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery> |}}{{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> 45a022bf8dd250f3cdf8e08de1fad38caefd4ccd 259 258 2023-10-28T15:53:39Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery>|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> {{{refs|}}}|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> a91869bb5bd542abb0cd90afc0492263a06e362b 260 259 2023-10-28T15:54:18Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> {{{gallery|}}} </gallery>|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> ae005226e3afe0fb0fa8041f92fab444b8e6dc20 261 260 2023-10-28T15:55:18Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5">{{{gallery|}}}</gallery>|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> faa650d7e9aac9fdb4fb08712117665b6c3d16f4 262 261 2023-10-28T16:01:08Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Location== {{{location|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> e23f21e5e0b7e06a3dd1dc96190f0522a8896176 267 262 2023-10-28T16:25:01Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} ==Appearance== {{{appearance|}}} ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> ba52c897a97f80ce6028726a7aab1105cf2e26dc 270 267 2023-10-28T16:37:29Z Silentg 2 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}} ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page Templates]] </noinclude> 912498b1a29a9ddb5ab8f307811a476d9402cd4a File:Owl Crest Mask Showcase.png 6 194 253 2023-10-28T15:38:38Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Owl Crest Mask Location.png 6 195 254 2023-10-28T15:39:11Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Owl Crest Mask 0 196 256 2023-10-28T15:43:42Z Reduckilous 4 Owl Crest mask page(No infobox yet) wikitext text/x-wiki The Owl Crest Mask is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask of all as the "beak" of the mask can be misinterpret as a happy mouth. <h2>Appearance</h2> The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils, and is actually the only current mask with both eyes and their pupils. There's also a "beak" which is a simple triangle shape, but it can be seen as a "happy mouth" as well. <h2>Location</h2> *It lies on a bridge directly below [[The First Gate]] and can be easily spotted. *You can get there by simply dropping down from the East side of the bridge in [[The First Gate]]. <h2>Showcase</h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Owl Crest Mask.png| The actual appearance of the mask Owl Crest Mask Location.png| The surrounding of the location of the mask Owl Crest Mask Showcase.png| Showcasing an Abyssal Walker wearing the mask </gallery> <h2>Trivia</h2> Despite having a description suggesting about a new "creature", there are no lore as to this. 0232c1fb941bf30bce1c339de20e7d805364633b 272 256 2023-10-28T17:17:28Z Reduckilous 4 wikitext text/x-wiki {{Mask | name = Owl Crest Mask | description = A mask with the face of a long-forgotten creature from the surface. | location = [[The First Gate]] | price = 400 | lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth. | appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape. | obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted. *You can get there by simply dropping down from the East side of the bridge in [[The First Gate]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Owl Crest Mask Icon.png|The actual appearance of the mask Owl Crest Mask Location.png|The surrounding of the location of the mask Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} b82e56dca371a4cf82e9b97514836ccdfa1b77bb 273 272 2023-10-28T17:24:34Z Reduckilous 4 Fixing some typos wikitext text/x-wiki {{Mask | name = Owl Crest Mask | description = A mask with the face of a long-forgotten creature from the surface. | location = [[The First Gate]] | price = 400 | lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth. | appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape. | obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted. *You can get there by simply dropping down from the East side of the bridge in [[The First Gate]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Owl Crest Mask Icon.png|The In-game icon of the mask Owl Crest Mask Location.png|The surrounding of the location of the mask Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 480fc056df5fed16673632baa55dc4ebac81b421 File:Moonlight Pico Mask Icon.png 6 197 263 2023-10-28T16:11:19Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Moonlight Pico Mask Showcase.png 6 198 264 2023-10-28T16:11:54Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Moonlight Pico Mask Location.png 6 199 265 2023-10-28T16:12:51Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Template:Mask/doc 10 200 266 2023-10-28T16:24:41Z Silentg 2 Created page with "This template is used as a blueprint to create articles for [[Masks|masks]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Mask | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the mask. ; description : The in-game description of the mask. ; loc..." wikitext text/x-wiki This template is used as a blueprint to create articles for [[Masks|masks]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Mask | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the mask. ; description : The in-game description of the mask. ; location : ; price : The price the player has to pay. ; lead : A short summary of the mask. ; appearance : Describe the mask's appearance as best as possible. ; obtain : A bulleted list containing various methods to obtain the mask. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the mask. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the mask. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> 20587053ba166338b8ca50368c5a47a9383e5a63 User:Silentg/sandbox 2 80 268 157 2023-10-28T16:33:58Z Silentg 2 Replaced content with ":3" wikitext text/x-wiki :3 a7c672648242f022986bc38a04b07cd846be75b2 Jack O’ Lantern Crest Mask 0 191 269 248 2023-10-28T16:34:33Z Silentg 2 Update, proofreading wikitext text/x-wiki {{Mask | name = Jack O’ Lantern Crest Mask | description = A mask bearing a festive face that fills you with a fondness for sweets. | location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]] | price = 400 | lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes. | obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]]. *To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it. *You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate. *You can fall down from the bridge before [[Witness Store]] to directly land on the item. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Jack O’ Lantern Crest Mask.png|The actual appearance of the mask Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} e5cec9bdfc21117d0083694b628b8236a2981c80 271 269 2023-10-28T17:16:17Z Reduckilous 4 Switches out the Mask png and the icon png in the gallery wikitext text/x-wiki {{Mask | name = Jack O’ Lantern Crest Mask | description = A mask bearing a festive face that fills you with a fondness for sweets. | location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]] | price = 400 | lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes. | obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]]. *To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it. *You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate. *You can fall down from the bridge before [[Witness Store]] to directly land on the item. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Jack O’ Lantern Crest Mask Icon.png|The In-game icon of the mask Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 09af2ef8d10d3295cc78960b3e9d27b208b15f2f Moonlight Pico Mask 0 201 274 2023-10-28T18:42:08Z Reduckilous 4 Creation of the moonlight pico mask page wikitext text/x-wiki {{Mask | name = Moonlight Pico Mask | description = Bearing the visage of a werewolf-colored dragon, you feel scared just touching it. | location = Near below [[Level 3 Ascent]] | price = 400 | lead = The '''Moonlight Pico Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is one of the hardest mask to find among the 7 for the fact that it doesn't glow like the others. | appearance = This mask has the shape of a brown-colored pico dragon from the game [https://cloudygamesllc.itch.io/dragon-drop Dragon Drop]. | obtain = *It is located behind a tree in an empty place under the "Wooden Branches" section in between [[Level 3 Ascent]] and [[Tower of Isolation]](On the East part of the map). * To get to it, you can go to the "Wooden Branches" section and fall down from there, landing on the empty place where the mask lies. * You can also teleport to [[Level 3 Ascent]] go Southeast and fall down to the zone there. * You can also go from [[Bridge of Connection]] and fall down from there to the same place. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Moonlight Pico Mask Icon.png|The In-game icon of the mask Moonlight Pico Mask Location.png|The surrounding of the location of the mask Moonlight Pico Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This Mask's icon have a tint of light blue on it, while the actual mask is simply a brown pico mask. *This Mask was initially intended to not be seasonal, however due to some certain players, it ended up being seasonal. }} 7e318fc02ba2c753b9eb7b7892dcf2370fcdd6fc File:Ghost Crest Mask Icon.png 6 202 275 2023-10-28T18:43:19Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ghost Crest Mask Location.png 6 203 276 2023-10-28T18:47:34Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ghost Crest Mask Showcase.png 6 204 277 2023-10-28T18:49:45Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Ghost Crest Mask 0 205 278 2023-10-28T19:07:48Z Reduckilous 4 creating the page wikitext text/x-wiki {{Mask | name = Ghost Crest Mask | description = A spooky mask featuring a spooky ghost. You try not to tremble with terror holding it. | location = [[Floor 4 Beginning]] | price = 400 | lead = The '''Ghost Crest Mask''' is one of the 7 Halloween masks released in October 2023. OOOooooOOoo SpO0okyyy... | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It's shapes resembles that of a ghost, but with small glowing eyes, making it rather...cute. | obtain = *It is located right under the start of the conveyor belt going from [[Floor 4 Beginning]]. *To get it, go to [[Floor 4 Beginning]] and drop down at the direction of the conveyor belt(West). | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Ghost Crest Mask Icon.png|The In-game icon of the mask Ghost Crest Mask Location.png|The surrounding of the location of the mask Ghost Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} de109c8698785400f72dee9cb916da287aab192c File:Creepy Smile Crest Mask Icon.png 6 206 279 2023-10-29T07:00:16Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Creepy Smile Crest Mask Location.png 6 207 280 2023-10-29T07:00:32Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Creepy Smile Crest Mask Showcase.png 6 208 281 2023-10-29T07:03:13Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Creepy Smile Crest Mask 0 209 282 2023-10-29T07:16:28Z Reduckilous 4 Created page with "{{Mask | name = Creepy Smile Crest Mask | description = A mask that only has an unnerving grin on it, wear it at your own risk. | location = Above [[Bridge of Connection]] | price = 400 | lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out. | appearance = The appearance of the mask is inverted compared to its icon, similar to..." wikitext text/x-wiki {{Mask | name = Creepy Smile Crest Mask | description = A mask that only has an unnerving grin on it, wear it at your own risk. | location = Above [[Bridge of Connection]] | price = 400 | lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. The mask only have a stripped smile in the middle of it. | obtain = *It is located right above the little roof above the checkpoint at [[Bridge of Connection]]. *You can reach it by simply going to [[Refinery Overlook]] and going in reverse(North) to fall down on the roof where the mask lies. *You can also [[Techs|Double Jump Stack]] up with another player from [[Bridge of Connection]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Creepy Smile Crest Mask Icon.png|The In-game icon of the mask Creepy Smile Crest Mask Location.png|The surrounding of the location of the mask Creepy Smile Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 6bf6c8fd0e216a1972e9cf9b5a1445f9c5c43945 File:Evil Eye Crest Mask Showcase.png 6 210 283 2023-10-29T08:17:08Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Evil Eye Crest Mask Icon.png 6 211 284 2023-10-29T08:17:42Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Evil Eye Crest Mask Location.png 6 212 285 2023-10-29T08:18:22Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Evil Eye Crest Mask 0 213 286 2023-10-29T08:19:55Z Reduckilous 4 Creation of the page wikitext text/x-wiki {{Mask | name = Evil Eye Crest Mask | description = A mask with a single terrifying, it peers into your soul. | location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest | price = 400 | lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds. | appearance = Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it. | obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]]. *To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Evil Eye Crest Mask Icon.png|The In-game icon of the mask Evil Eye Crest Mask Location.png|The surrounding of the location of the mask Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} c5c38bd9445c8b368ce2e68425df2d4e6ca77412 287 286 2023-10-29T08:28:52Z Reduckilous 4 Just adding some sentences wikitext text/x-wiki {{Mask | name = Evil Eye Crest Mask | description = A mask with a single terrifying, it peers into your soul. | location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest | price = 400 | lead = The appearance of the mask is inverted compared to its icon, similar to many other masks. The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds. | appearance = Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it. | obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]]. *To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Evil Eye Crest Mask Icon.png|The In-game icon of the mask Evil Eye Crest Mask Location.png|The surrounding of the location of the mask Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 0b74aa03d82c23ff1c1ccad3e51048d4a9310087 288 287 2023-10-29T08:29:58Z Reduckilous 4 FIxing my last edit wikitext text/x-wiki {{Mask | name = Evil Eye Crest Mask | description = A mask with a single terrifying, it peers into your soul. | location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest | price = 400 | lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it. | obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]]. *To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Evil Eye Crest Mask Icon.png|The In-game icon of the mask Evil Eye Crest Mask Location.png|The surrounding of the location of the mask Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 7a19a835f2dd2a89caf7a60099236b15d4f011fd File:Skull Crest Mask Icon.png 6 214 289 2023-10-29T08:36:41Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Skull Crest Mask Location.png 6 215 290 2023-10-29T08:38:01Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Skull Crest Mask Showcase.png 6 216 291 2023-10-29T08:39:22Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Skull Crest Mask 0 217 292 2023-10-29T08:44:56Z Reduckilous 4 Created page with "{{Mask | name = Skull Crest Mask | description = A mask bearing a festive face that fills you with a fondness for mischief. | location = [[Refinery Overlook]] - [[Level 4 Ending]] North | price = 400 | lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resemblance a human skull without the jaws. Ther..." wikitext text/x-wiki {{Mask | name = Skull Crest Mask | description = A mask bearing a festive face that fills you with a fondness for mischief. | location = [[Refinery Overlook]] - [[Level 4 Ending]] North | price = 400 | lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resemblance a human skull without the jaws. There're also glowing circular eyes. | obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot. * To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies. * You can also reach it by advancing from [[Refinery Overlook]] normally. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Skull Crest Mask Icon.png |The In-game icon of the mask Skull Crest Mask Location.png|The surrounding of the location of the mask Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. *The skull resemblance the skull emoji. }} b738bf68f4e6fe9ac2cd0a31b99183a032f86088 Dyes 0 218 293 2023-10-29T09:04:57Z Reduckilous 4 Created page with "{| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal Colors |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col..." wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal Colors |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffe03c; color: black" | [[Orange Dye|Orange]] |[[Sanctum Overlook]], next to the NPC with the same dye color. |72 |Easy 507926151cc6b6087d07c2a7a32b5cff98ab1250 File:Orange Dye.png 6 219 294 2023-10-29T09:15:03Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 295 294 2023-10-29T09:43:53Z Reduckilous 4 Reduckilous moved page [[File:Orange dye.png]] to [[File:Orange Dye.png]]: Misspelled title wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Orange dye.png 6 220 296 2023-10-29T09:43:54Z Reduckilous 4 Reduckilous moved page [[File:Orange dye.png]] to [[File:Orange Dye.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Orange Dye.png]] d7209201ceb781ab57f5a92b7ff32513a459ee20 File:Orange Dye Full Showcase.png 6 221 297 2023-10-29T09:48:27Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Orange Dye Showcase.png 6 222 298 2023-10-29T09:48:46Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Orange Dye Witness.png 6 223 299 2023-10-29T09:48:59Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Orange Dye Location.png 6 224 300 2023-10-29T09:50:36Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Orange Dye Bottle.png 6 225 301 2023-10-29T09:54:05Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Orange Dye 0 226 302 2023-10-29T10:06:37Z Reduckilous 4 Created page with "{{Infobox | bodystyle = background-color:#0B2347; color:#FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Orange Dye | name = Orange Dye | image = [[File:Orange Dye.png|200px]] | label1 = Min graphic hex | data1 = <nowiki>#3472AD</nowiki> | label2 = Max graphic hex | data2 = <nowiki>#ffe03c</nowiki> | label3 = Location | data3 = [[Sanctum Overlook]] | label4 = Price | data4 = 0AE }} The Orange Dye is the first ever seasonal dye to ev..." wikitext text/x-wiki {{Infobox | bodystyle = background-color:#0B2347; color:#FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = Orange Dye | name = Orange Dye | image = [[File:Orange Dye.png|200px]] | label1 = Min graphic hex | data1 = <nowiki>#3472AD</nowiki> | label2 = Max graphic hex | data2 = <nowiki>#ffe03c</nowiki> | label3 = Location | data3 = [[Sanctum Overlook]] | label4 = Price | data4 = 0AE }} The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color. <h2> Obtainment </h2> *It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]]. <h2> Gallery </h2> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Orange Dye Bottle.png|The Dye Bottle Orange Dye Showcase.png|Showcasing the Dye without accessories Orange Dye Full Showcase.png|Showcasing the Dye with accessories Orange Dye Witness.png|A Witness with the dye Orange Dye Location.png|The Dye's location </gallery> <h2> Trivia </h2> *The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released. 213ac7073da20c6678bf08482c6279b701484ffa File:Abital's Mask.png 6 227 303 2023-11-02T16:41:39Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 306 303 2023-11-02T16:49:09Z Reduckilous 4 Reduckilous uploaded a new version of [[File:Abital's Mask.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Abyssal Mask.png 6 228 304 2023-11-02T16:42:45Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 305 304 2023-11-02T16:48:18Z Reduckilous 4 Reduckilous uploaded a new version of [[File:Abyssal Mask.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ancient Grace.png 6 229 307 2023-11-02T17:24:26Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Ancient Relic Mask.png 6 230 308 2023-11-02T17:24:35Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Apple Pico Mask.png 6 231 309 2023-11-02T17:24:42Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Arrow Crest Mask.png 6 232 310 2023-11-02T17:25:02Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Bard Crest Mask.png 6 233 311 2023-11-02T17:25:09Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 343 311 2023-11-07T12:05:26Z Reduckilous 4 Reduckilous moved page [[File:Bard Crest Mask .png]] to [[File:Bard Crest Mask.png]]: Misspelled title wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Blueberry Pico Mask.png 6 234 312 2023-11-02T17:25:18Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Circle Crest Mask.png 6 235 313 2023-11-02T17:25:36Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Connection Crest Mask.png 6 236 314 2023-11-02T17:25:42Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Court Crest Mask.png 6 237 315 2023-11-02T17:25:54Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Direction Crest Mask.png 6 238 316 2023-11-02T17:26:00Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Dot Crest Mask.png 6 239 317 2023-11-02T17:26:14Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Fire Kanji Mask.png 6 240 318 2023-11-02T17:27:10Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 348 318 2023-11-09T11:01:11Z Reduckilous 4 Reduckilous moved page [[File:Fire Crest Mask.png]] to [[File:Fire Kanji Mask.png]]: Misspelled title wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Golem Pico Mask.png 6 241 319 2023-11-02T17:27:19Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Gradient Mask Red.png 6 242 320 2023-11-02T17:27:28Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Green Square.png 6 243 321 2023-11-02T17:27:40Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Gumball Pico Mask.png 6 244 322 2023-11-02T17:27:53Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Line Crest Mask.png 6 245 323 2023-11-02T17:28:06Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Location Crest Mask.png 6 246 324 2023-11-02T17:28:22Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Magma Pico Mask.png 6 247 325 2023-11-02T17:28:36Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Mask of Prestige Awakened Form.png 6 248 326 2023-11-02T17:28:53Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Mask of Prestige Dormant Form.png 6 249 327 2023-11-02T17:28:59Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Mask of Truth.png 6 250 328 2023-11-02T17:29:07Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Melon Pico Mask.png 6 251 329 2023-11-02T17:29:17Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Pale Blue Mask.png 6 252 330 2023-11-02T17:29:33Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Rei's Mask.png 6 253 331 2023-11-02T17:29:49Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Runic Mask.png 6 254 332 2023-11-02T17:30:14Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Sandy Pico Mask.png 6 255 333 2023-11-02T17:30:22Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Smilling Crest Mask.png 6 256 334 2023-11-02T17:30:35Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Square Crest Mask.png 6 257 335 2023-11-02T17:30:46Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Visage of Apathy.png 6 258 336 2023-11-02T17:31:00Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Visage of Joy.png 6 259 337 2023-11-02T17:31:13Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Visage of Sorrow.png 6 260 338 2023-11-02T17:32:08Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Warrior Mask Orange.png 6 261 339 2023-11-02T17:32:18Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Wren's Mask.png 6 262 340 2023-11-02T17:32:24Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Masks 0 169 341 221 2023-11-03T12:13:43Z Reduckilous 4 Temporary placing template on the table wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Normal masks |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |} {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |+ style="color:#0B2347; text-align: Left; font-size:20px" | Seasonal masks |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} 6652b4ed61dd358a28f974430482462d7e72125d 342 341 2023-11-06T11:00:26Z Reduckilous 4 changing the heading wikitext text/x-wiki == Normal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |- | [[Masks]] | [[File:Placeholder.png|100px|link=[[Masks]]]] | * Located * Can be | meter |difficulty |} == Seasonal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} 2a962073cb3c8454e0106b5fe4e4b5dd1e0a19d5 345 342 2023-11-07T15:50:56Z Reduckilous 4 Finishing up the normal mask section wikitext text/x-wiki == Normal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} == Seasonal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} 1d2cbe288bb1aaa5ef28e2c1c3267bc32dc7eb30 347 345 2023-11-08T14:11:08Z Reduckilous 4 W.I.P wikitext text/x-wiki == Normal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} ==Challenge Masks== {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Challenge |- | [[Visage of Apathy]] | [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s altar. |- | [[Visage of Sorrow]] | [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s altar. |- | [[Visage of Joy]] | [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s altar. |} == Seasonal Masks == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ==Misc Masks== {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Gumball Pico Mask]] | [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]] | Obtained by entering a certain code in the game [[Journey to the sun]] c48529b67a14a7d5396af11f864e802eb4ec15c0 File:Bard Crest Mask .png 6 263 344 2023-11-07T12:05:26Z Reduckilous 4 Reduckilous moved page [[File:Bard Crest Mask .png]] to [[File:Bard Crest Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Bard Crest Mask.png]] 6fc7e59b0813a30a9beadc823458388a6b9558be Template:Mask 10 192 346 270 2023-11-08T06:00:55Z 2.50.175.15 0 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}} ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 7ca41d5ebf1a6579cd00d028fca5a5d3e9683e80 File:Fire Crest Mask.png 6 264 349 2023-11-09T11:01:12Z Reduckilous 4 Reduckilous moved page [[File:Fire Crest Mask.png]] to [[File:Fire Kanji Mask.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Fire Kanji Mask.png]] 6f67456378f930941ddcb496429a0579f7010400 File:Neon Pico Mask.png 6 265 350 2023-11-09T12:58:56Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Dragon Drop Crest Mask.png 6 266 351 2023-11-09T13:06:18Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Wren's Mask.png 6 262 352 340 2023-11-09T13:29:28Z Reduckilous 4 Reduckilous moved page [[File:Wren Mask.png]] to [[File:Wren's Mask.png]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Wren Mask.png 6 267 353 2023-11-09T13:29:28Z Reduckilous 4 Reduckilous moved page [[File:Wren Mask.png]] to [[File:Wren's Mask.png]] wikitext text/x-wiki #REDIRECT [[File:Wren's Mask.png]] 91f3f3f8e589ba1a090655cac7130f91630ff425 File:Mask of Truth.png 6 250 354 328 2023-11-09T13:30:07Z Reduckilous 4 Reduckilous moved page [[File:Mask's of Truth.png]] to [[File:Mask of Truth.png]]: Misspelled title wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Mask's of Truth.png 6 268 355 2023-11-09T13:30:07Z Reduckilous 4 Reduckilous moved page [[File:Mask's of Truth.png]] to [[File:Mask of Truth.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Mask of Truth.png]] a48a9fd27e46f9b91160d5556f87d07877415d9d Masks 0 169 356 347 2023-11-09T13:47:16Z Reduckilous 4 wikitext text/x-wiki == Normal Masks == Normal Masks can be found anywhere in the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable of Abyssal along with wings and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} ==Challenge Masks== Challenge Masks are only obtainable through completion of challenges. They usually resemble a Sid expression. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Challenge |- | [[Visage of Apathy]] | [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar. |- | [[Visage of Sorrow]] | [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar. |- | [[Visage of Joy]] | [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar. |} == Seasonal Masks == Season Masks are only obtainable in a certain annual season or events. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ==Misc Masks== Misc Masks includes masks that do not fits into any of the above sections. They include purchasable masks, Loyalty Rewards, and promotional masks. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Fire Kanji Mask]] | [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends| Welcome To Toast Your Friends]] badge from the game [[https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends| Toast Your Friends]]. |- | [[Green Square]] | [[File:Green Square.png|100px|link=[[Green Square]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537200/Collect-10-Coins| Collect 10 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Pale Blue Mask]] | [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Gradient Mask Red]] | [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Warrior Mask Orange]] | [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537203/Collect-75-Coins| Collect 75 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Ancient Relic Mask]] | [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537204/Collect-ALL-Coins| Collect ALL Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Ancient Grace]] | [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537205/Reach-the-Sun| Reach the Sun]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Gumball Pico Mask]] | [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector| Gumball Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Melon Pico Mask]] | [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector| Melon Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Mask of Prestige Dormant Form]] | [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020608/Begin-Again| Begin-Again]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Mask of Prestige Awakened Form]] | [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020662/Seventh-Heaven| Seventh Heaven]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Wren's Mask]] | [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed| Metaverse 2021 Event Completed]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. No longer obtainable. |- | [[Dragon Drop Crest Mask]] | [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks. |- | [[Neon Pico Mask]] | [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks. |- | [[Runic Mask]] | [[File:Runic Mask.png|100px|link=[[Runic Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/247799076/Runic-Set| Runic Set]]. |- | [[Abital's Mask]] | [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/12778368/Abitals-Set| Abital's set]]. |- | [[Rei's Mask]] | [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel| Rei's Set]]. |- | [[Mask of Truth]] | [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/12775128/Truth-Set| Truth Set]]. |} 0dbce2057350c0b942580b049e047b5bc9824ccb 357 356 2023-11-09T15:01:05Z Silentg 2 /* Misc Masks */ wikitext text/x-wiki == Normal Masks == Normal Masks can be found anywhere in the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable of Abyssal along with wings and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} ==Challenge Masks== Challenge Masks are only obtainable through completion of challenges. They usually resemble a Sid expression. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Challenge |- | [[Visage of Apathy]] | [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar. |- | [[Visage of Sorrow]] | [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar. |- | [[Visage of Joy]] | [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar. |} == Seasonal Masks == Season Masks are only obtainable in a certain annual season or events. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ==Miscellaneous Masks== Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Fire Kanji Mask]] | [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends| Welcome To Toast Your Friends]] badge from the game [[https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends| Toast Your Friends]]. |- | [[Green Square]] | [[File:Green Square.png|100px|link=[[Green Square]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537200/Collect-10-Coins| Collect 10 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Pale Blue Mask]] | [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Gradient Mask Red]] | [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537201/Collect-50-Coins| Collect 50 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Warrior Mask Orange]] | [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537203/Collect-75-Coins| Collect 75 Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Ancient Relic Mask]] | [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537204/Collect-ALL-Coins| Collect ALL Coins]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Ancient Grace]] | [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124537205/Reach-the-Sun| Reach the Sun]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Gumball Pico Mask]] | [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector| Gumball Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Melon Pico Mask]] | [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector| Melon Pico Mask Collector]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Mask of Prestige Dormant Form]] | [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020608/Begin-Again| Begin-Again]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Mask of Prestige Awakened Form]] | [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2129020662/Seventh-Heaven| Seventh Heaven]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. |- | [[Wren's Mask]] | [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]] | Claimed from Loyalty Reward while having the [[https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed| Metaverse 2021 Event Completed]] badge from the game [[https://www.roblox.com/games/4616247820/Journey-to-the-Sun| Journey to the Sun]]. No longer obtainable. |- | [[Dragon Drop Crest Mask]] | [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks. |- | [[Neon Pico Mask]] | [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks. |- | [[Runic Mask]] | [[File:Runic Mask.png|100px|link=[[Runic Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/247799076/Runic-Set| Runic Set]]. |- | [[Abital's Mask]] | [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/12778368/Abitals-Set| Abital's set]]. |- | [[Rei's Mask]] | [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel| Rei's Set]]. |- | [[Mask of Truth]] | [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]] | Obtained from buying the [[https://www.roblox.com/game-pass/12775128/Truth-Set| Truth Set]]. |} 91ce10e080b6ed58c74bc45b5e3d40caa240dc6b 362 357 2023-11-09T15:25:56Z Silentg 2 wikitext text/x-wiki {{See also|Wings|Dyes}} Masks are one of the three main cosmetics in the game. == Normal Masks == Normal masks can be found in certain locations around the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable cosmetics along with wings and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} ==Challenge Masks== Challenge masks are only obtainable through the completion of challenges. They usually resemble a Sid expression. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Challenge |- | [[Visage of Apathy]] | [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar. |- | [[Visage of Sorrow]] | [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar. |- | [[Visage of Joy]] | [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar. |} == Seasonal Masks == Seasonal masks are masks that are only obtainable during a certain annual season or event. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ==Miscellaneous Masks== Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Fire Kanji Mask]] | [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends Welcome To Toast Your Friends]] badge from the game [https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends Toast Your Friends]. |- | [[Green Square]] | [[File:Green Square.png|100px|link=[[Green Square]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537200/Collect-10-Coins Collect 10 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Pale Blue Mask]] | [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Gradient Mask Red]] | [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Warrior Mask Orange]] | [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537203/Collect-75-Coins Collect 75 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Ancient Relic Mask]] | [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537204/Collect-ALL-Coins Collect ALL Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Ancient Grace]] | [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537205/Reach-the-Sun Reach the Sun] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Gumball Pico Mask]] | [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector Gumball Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Melon Pico Mask]] | [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector Melon Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Mask of Prestige Dormant Form]] | [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020608/Begin-Again Begin-Again] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Mask of Prestige Awakened Form]] | [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020662/Seventh-Heaven Seventh Heaven] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Wren's Mask]] | [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed Metaverse 2021 Event Completed] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. No longer obtainable. |- | [[Dragon Drop Crest Mask]] | [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks. |- | [[Neon Pico Mask]] | [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks. |- | [[Runic Mask]] | [[File:Runic Mask.png|100px|link=[[Runic Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set]. |- | [[Abital's Mask]] | [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set]. |- | [[Rei's Mask]] | [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set]. |- | [[Mask of Truth]] | [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set]. |} f59dbc6e041fb084b7264bcaba68c3580de6fa3d 363 362 2023-11-09T17:24:32Z Reduckilous 4 nitpicking here and there lol wikitext text/x-wiki {{See also|Wings|Dyes}} Masks are one of the three main cosmetics in the game. == Normal Masks == Normal masks can be found in certain locations around the map that can be bought for prices ranging from 400 AE or cheaper. They are the main form of collectable cosmetics along with wings and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Abyssal Mask]] | [[File:Abyssal Mask.png|100px|link=[[Abyssal Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Square Crest Mask]] | [[File:Square Crest Mask.png|100px|link=[[Square Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Line Crest Mask]] | [[File:Line Crest Mask.png|100px|link=[[Line Crest Mask]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Location Crest Mask]] | [[File:Location Crest Mask.png|100px|link=[[Location Crest Mask]]]] | * Located below the section before [[Sanctum Overlook]]. * Can be obtained by going North from [[Sanctum Overlook]] and fall down after passing 4 platforms. |19 |Medium |- | [[Court Crest Mask]] | [[File:Court Crest Mask.png|100px|link=[[Court Crest Mask]]]] | * Located on a 2 player required section in [[Sanctum Overlook]]. * Can be obtained by making it up the obby course in [[Sanctum Overlook]] with another player's help. |93 |Medium |- | [[Arrow Crest Mask]] | [[File:Arrow Crest Mask.png|100px|link=[[Arrow Crest Mask]]]] | * Located in the room directly above the Dye Store in [[Level 2 Ascent]] * Can be obtained by falling onto the Dye Store sign from the section between [[Level 2 Ascent]] and [[Plinko Overlook]] and then jumping into the room where the mask lies. |178 |Easy |- | [[Circle Crest Mask]] | [[File:Circle Crest Mask.png|100px|link=[[Circle Crest Mask]]]] | * Located on one of the arch beam in the hall behind [[Witness Store]]. * Can be obtained by going to [[Tower of Isolation]] and walk toward West then fall down to the beam where the mask lies. | 310 |Medium |- | [[Connection Crest Mask]] | [[File:Connection Crest Mask.png|100px|link=[[Connection Crest Mask]]]] | * Located in a small altar that is next to the bridge between [[Plinko Overlook]] and [[Witness Store]] * Can be quickly be obtained by falling from the West of [[Floor 4 Beginning]] directly onto the small altar where the mask resides in. |286 |Easy |- | [[Direction Crest Mask]] | [[File:Direction Crest Mask.png|100px|link=[[Direction Crest Mask]]]] | * Located in a small altar that is on a 2 player required parkour section in the Northeast corner of the map, between [[Tower of Isolation]] and [[Bridge of Connection]]. * Can be obtained by making it through the parkour section with the help of another player. |698 |Easy |- | [[Bard Crest Mask]] | [[File:Bard Crest Mask.png|100px|link=[[Bard Crest Mask]]]] | * Located on the support beams on the very North of [[Bridge of Connection]]. * Can be obtained by going to the Northern end of [[Bridge of connection]] and [[Techs| Cancel Velocity]] down onto the mask. |752 |Medium |- | [[Smilling Crest Mask]] | [[File:Smilling Crest Mask.png|100px|link=[[Smilling Crest Mask]]]] | * Located lower Southeast from [[Floor 4 Beginning]]. * Can be obtained by going Southeast from [[Floor 4 Beginning]] and fall down to where the mask lies. |783 |Easy |- | [[Dot Crest Mask]] | [[File:Dot Crest Mask.png|100px|link=[[Dot Crest Mask]]]] | * Located on a platform far below the end of the first conveyor belt from [[Floor 4 Beginning]]. * Can be obtain by riding the conveyor belt on [[Floor 4 Beginning]] until you fall off onto a platform where the mask lies. |681 |Medium |- | [[Magma Pico Mask]] | [[File:Magma Pico Mask.png|100px|link=[[Magma Pico Mask]]]] | * Located in the [[Hall of Loyalty]]. * Can be obtained by going to the [[Hall of Loyalty]] and search the area behind the entrance to find the mask which is between 2 column. | 1 |Medium |- | [[Apple Pico Mask]] | [[File:Apple Pico Mask.png|100px|link=[[Apple Pico Mask]]]] | * Located at the very end of the hallway that's started from the hall next to [[Witness Store]]. * Can be quickly obtained by going South [[Tower of Isolation]] and fall down to below the small parkour section to where the mask lies. | 287 |Medium |- | [[Blueberry Pico Mask]] | [[File:Blueberry Pico Mask.png|100px|link=[[Blueberry Pico Mask]]]] | * Located on the second floor of the building that's on the north of [[Beginner's Grotto]]. * Can be reached by falling from the South of [[Level 3 Ascent]]. |47 |Medium |- | [[Sandy Pico Mask]] | [[File:Sandy Pico Mask.png|100px|link=[[Sandy Pico Mask]]]] | * Located on the wall below [[Floor 4 Beginning]] * Can be reached by going West from [[Floor 4 Beginning]] to the part below the conveyor then fall down while hugging the wall to land to where the mask resides. |583 |Hard |- | [[Golem Pico Mask]] | [[File:Golem Pico Mask.png|100px|link=[[Golem Pico Mask]]]] | * Located under the sand platform on the Eastern part of the map, between [[Floor 4 Beginning]] and [[Refinery Outlook]]. * Can be obtained by going to the sand platform mentioned above and [[Techs|Cancel Velocity]] on to a small node on the middle support beam, and then jump over onto the mask. |980 |Hard |} ==Challenge Masks== Challenge masks are only obtainable through the completion of challenges. They usually resemble a Sid expression. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Challenge |- | [[Visage of Apathy]] | [[File:Visage of Apathy.png|100px|link=[[Visage of Apathy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 3 Ascent]]'s pillar. |- | [[Visage of Sorrow]] | [[File:Visage of Sorrow.png|100px|link=[[Visage of Sorrow]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Floor 4 Beginning]]'s pillar. |- | [[Visage of Joy]] | [[File:Visage of Joy.png|100px|link=[[Visage of Joy]]]] | Start the challenge from the [[Sid Follower]] in [[Abyssal Sanctum Market]] and end the challenge in [[Level 5 Ascent]]'s pillar. |} == Seasonal Masks == Seasonal masks are masks that are only obtainable during a certain annual season or event. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Jack O’ Lantern Crest Mask]] | [[File:Jacko1.png|100px|link=[[Jack O’ Lantern Crest Mask]]]] | * Located on one of the chimney above Abyssal Energy Exchange and next to Dye Store in [[Abyssal Sanctum Market]]. * Can be obtained the quickest by falling down the bridge near [[Witness Store]]. | 19 | Easy |- | [[Owl Crest Mask]] | [[File:Owl1.png|100px|link=[[Owl Crest Mask]]]] | Located right below [[The First Gate]], can be reached by simply going to [[The First Gate]] and drop down to the broken bridge below it. | 63 | Easy |- | [[Moonlight Pico Mask]] | [[File:Moonlightpico1.png|100px|link=[[Moonlight Pico Mask]]]] | * Located under a tree somewhat far below from [[Bridge of Connection]]. Can be obtained by falling down from [[Bridge of Connection]] as well. * Can also be obtained from [[Level 3 Ascent]] by going Southeast from there and falling down. | 312 | Medium |- | [[Ghost Crest Mask]] | [[File:Ghost1.png|100px|link=[[Ghost Crest Mask]]]] | Located a bit under [[Floor 4 Beginning]] and can be obtained by going Southwest(Right of the Sid altar) from [[Floor 4 Beginning]] and fall down. | 783 | Easy |- | [[Creepy Smile Crest Mask]] | [[File:Creepysmile1.png|100px|[[link=Creepy Smile Crest Mask]]]] | * Located directly above [[Bridge of Connection]]. * Can be reached from falling near [[Refinery Overlook]]. | 805 | Medium |- | [[Evil Eye Crest Mask]] | [[File:EvilEye1.png|100px|link=[[Evil Eye Crest Mask]]]] | Located below the end of the conveyor Southeast to Southwest from [[Refinery Overlook]]. | 1040 | Easy |- | [[Skull Crest Mask]] | [[File:Skull1.png|100px|link=[[Skull Crest Mask]]]] | * Located on a large pipe in the north part of [[Refinery Overlook]] - [[Level 4 Ending]]. * Can be quicky reached by falling down from [[Level 4 Ending]] or proceeding the level normally. | 1175 | Easy |} ==Miscellaneous Masks== Miscellaneous masks includes all the other masks that do not fit into any of the above sections. They include purchasable masks, masks obtained from loyalty rewards, and promotional masks. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Fire Kanji Mask]] | [[File:Fire Kanji Mask.png|100px|link=[[Fire Kanji Masks]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2133984392/Welcome-To-Toast-Your-Friends Welcome To Toast Your Friends] badge from the game [https://www.roblox.com/games/12092476136/NEW-LEVELS-Toast-Your-Friends Toast Your Friends]. |- | [[Green Square]] | [[File:Green Square.png|100px|link=[[Green Square]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537200/Collect-10-Coins Collect 10 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Pale Blue Mask]] | [[File:Pale Blue Mask.png|100px|link=[[Pale Blue Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Gradient Mask Red]] | [[File:Gradient Mask Red.png|100px|link=[[Gradient Mask Red]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537201/Collect-50-Coins Collect 50 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Warrior Mask Orange]] | [[File:Warrior Mask Orange.png|100px|link=[[Warrior Mask Orange]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537203/Collect-75-Coins Collect 75 Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Ancient Relic Mask]] | [[File:Ancient Relic Mask.png|100px|link=[[Ancient Relic Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537204/Collect-ALL-Coins Collect ALL Coins] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Ancient Grace]] | [[File:Ancient Grace.png|100px|link=[[Ancient Grace]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124537205/Reach-the-Sun Reach the Sun] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Gumball Pico Mask]] | [[File:Gumball Pico Mask.png|100px|link=[[Gumball Pico Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997784/Gumball-Pico-Mask-Collector Gumball Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Melon Pico Mask]] | [[File:Melon Pico Mask.png|100px|link=[[Melon Pico Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124997623/Melon-Pico-Mask-Collector Melon Pico Mask Collector] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Mask of Prestige Dormant Form]] | [[File:Mask of Prestige Dormant Form.png|100px|link=[[Mask of Prestige Dormant Form]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020608/Begin-Again Begin Again] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Mask of Prestige Awakened Form]] | [[File:Mask of Prestige Awakened Form.png|100px|link=[[Mask of Prestige Awakened Form]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2129020662/Seventh-Heaven Seventh Heaven] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. |- | [[Wren's Mask]] | [[File:Wren's Mask.png|100px|link=[[Wren's Mask]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2124673003/Metaverse-2021-Event-Completed Metaverse 2021 Event Completed] badge from the game [https://www.roblox.com/games/4616247820/Journey-to-the-Sun Journey to the Sun]. No longer obtainable. |- | [[Dragon Drop Crest Mask]] | [[File:Dragon Drop Crest Mask.png|100px|link=[[Dragon Drop Crest Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 2 pico masks. |- | [[Neon Pico Mask]] | [[File:Neon Pico Mask.png|100px|link=[[Neon Pico Mask]]]] | Claimed from the Pico pillar in the Western part of the map in [[Level 4 Ending]] while possessing 5 pico masks. |- | [[Runic Mask]] | [[File:Runic Mask.png|100px|link=[[Runic Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set]. |- | [[Abital's Mask]] | [[File:Abital's Mask.png|100px|link=[[Abital's Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set]. |- | [[Rei's Mask]] | [[File:Rei's Mask.png|100px|link=[[Rei's Mask]]]] | Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set]. |- | [[Mask of Truth]] | [[File:Mask of Truth.png|100px|link=[[Mask of Truth]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set]. |} 7ff13e8ccbb69cd57798383dfe593a56eefca0b7 Template:See also 10 269 358 2023-11-09T15:11:24Z Silentg 2 Created page with "<includeonly>{{#invoke:Labelled list hatnote|labelledList|See also}}</includeonly><noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude>" wikitext text/x-wiki <includeonly>{{#invoke:Labelled list hatnote|labelledList|See also}}</includeonly><noinclude> {{documentation}} <!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --> </noinclude> 74d2ab6a0df5605fbe2085c405925ec659be52b7 Template:See also/doc 10 270 359 2023-11-09T15:11:46Z Silentg 2 Created page with "{{documentation subpage}} {{used in system|in [[MediaWiki:wantedpages-summary]]}} {{lua|Module:Labelled list hatnote}} This template is used to create '''[[WP:Hatnotes|hatnotes]] to point to a small number of other related titles''' at the '''top of article ''[[Help:Section|sections]]''''' (excluding the [[WP:LEAD|lead]]). It looks like this: {{See also|Article}} Do not use this template on top of a page, where hatnotes are for disambiguation and not for related topic..." wikitext text/x-wiki {{documentation subpage}} {{used in system|in [[MediaWiki:wantedpages-summary]]}} {{lua|Module:Labelled list hatnote}} This template is used to create '''[[WP:Hatnotes|hatnotes]] to point to a small number of other related titles''' at the '''top of article ''[[Help:Section|sections]]''''' (excluding the [[WP:LEAD|lead]]). It looks like this: {{See also|Article}} Do not use this template on top of a page, where hatnotes are for disambiguation and not for related topics (according to [[WP:RELATED]]). Do not use this template inside [[Wikipedia:Manual of Style/Layout#"See also" section|the ''"See also" section'']] at the end of an article, or for links to other articles or subsections of the same article within regular article text. Where subsections are linked to, [[Template:Section link]] may be suitable instead. For use on category pages, the corresponding template is [[Template:Category see also]]. Refer to the examples below to see how the template handles link targets containing section links and commas. ==Usage== {{see|WP:SUMMARYHATNOTE}} ; Basic usage: &#123;{See also|''page1''|''page2''|''page3''|...}} ; All parameters: &#123;{See also|''page1''|''page2''|''page3''| ... |label 1 = ''label 1''|label 2 = ''label2''|label 3 = ''label3''| ... |l1 = ''label1''|l2 = ''label2''|l3 = ''label3''| ... |selfref = ''yes''|category = ''no''}} ==Parameters== This template accepts the following parameters: * <code>1</code>, <code>2</code>, <code>3</code>, ... – the pages to link to. At least one page name is required. Categories and files are automatically escaped with the [[Help:Colon trick|colon trick]], and links to sections are automatically formatted as ''page § section'', rather than the MediaWiki default of ''page#section''. * <code>label 1</code>, <code>label 2</code>, <code>label 3</code>, ...; or <code>l1</code>, <code>l2</code>, <code>l3</code>, ...; optional labels for each of the pages to link to. * <code>selfref</code> – if set to "yes", "y", "true" or "1", adds the CSS class "selfref". This is used to denote self-references to Wikipedia. See [[Template:Selfref]] for more information. * <code>category</code> – if set to "no", "n", "false", or "0", suppresses the error tracking category ([[:Category:Hatnote templates with errors]]). This only has an effect if the first positional parameter (the page to link to) is omitted. == Examples == * <code><nowiki>{{See also|Article}}</nowiki></code> → {{See also|Article}} * <code><nowiki>{{See also|Article#Section}}</nowiki></code> → {{See also|Article#Section}} * <code><nowiki>{{See also|Article#Section|label 1=Custom section label}}</nowiki></code> → {{See also|Article#Section|label 1=Custom section label}} * <code><nowiki>{{See also|Article1|Article2|Article3}}</nowiki></code> → {{See also|Article1|Article2|Article3}} * <code><nowiki>{{See also|Article1|Article,2|Article3}}</nowiki></code> → {{See also|Article1|Article,2|Article3}} * <code><nowiki>{{See also|Article1|l1=Custom label 1|Article2|l2=Custom label 2}}</nowiki></code> → {{See also|Article1|l1=Custom label 1|Article2|l2=Custom label 2}} * <code><nowiki>{{See also|Veni, vidi, vici|Julius Caesar}}</nowiki></code> → {{See also|Veni, vidi, vici|Julius Caesar}} * <code><nowiki>{{See also|Veni, vidi, vici|Julius Caesar#Civil war}}</nowiki></code> → {{See also|Veni, vidi, vici|Julius Caesar#Civil war}} * <code><nowiki>{{See also|Julius Caesar#Civil war|Veni, vidi, vici}}</nowiki></code> → {{See also|Julius Caesar#Civil war|Veni, vidi, vici}} * <code><nowiki>{{See also|Julius Caesar#Civil war|Crossing the Rubicon}}</nowiki></code> → {{See also|Julius Caesar#Civil war|Crossing the Rubicon}} ==Errors== If no page names are supplied, the template outputs the following message with the (help) wikilink pointing to the "Errors" section of this page: *{{See also|category=no}} If you see this error message, it is for one of three reasons: # No parameters were specified (the template code was <code><nowiki>{{See also}}</nowiki></code> with no pipe character nor page to link to). Please use <code><nowiki>{{See also|</nowiki>''page''<nowiki>}}</nowiki></code> instead. # Some parameters were specified, but no page names were included. For example, the template text <code><nowiki>{{See also|selfref=yes}}</nowiki></code> will produce this error. Please use (for example) <code><nowiki>{{See also|</nowiki>''page''<nowiki>|selfref=yes}}</nowiki></code> instead. # A page name was specified, but it contains an equals sign ("="). The equals sign has a special meaning in template code, and because of this it cannot be used in template parameters that do not specify a parameter name. For example, the template code <code><nowiki>{{See also|1+1=2|2+2=4}}</nowiki></code> will produce this error. To work around this, you can specify the parameter name explicitly by using <code>1=</code>, <code>2</code>, etc., before the page name, like this: <code><nowiki>{{See also|1=1+1=2|2=2+2=4}}</nowiki></code>. If you see this error message and are unsure of what to do, please post a message on [[WP:HD|the help desk (WP:HD)]], and someone should be able to help you. To see a list of wikilinks to articles that contain this error message, see the [[Wikipedia:Maintenance|maintenance category]]: [[:Category:Hatnote templates with errors]]. ==TemplateData== {{Collapse top|[[Wikipedia:TemplateData|TemplateData]] documentation used by [[Wikipedia:VisualEditor|VisualEditor]] and other tools}} {{TemplateData header|noheader=1}} <templatedata> { "description": "This template creates a hatnote to point to a small number of related pages. It is placed at the top of a section, directly underneath the section heading.", "params": { "1": { "label": "Page 1", "description": "The name of the first page that you want to link to.", "type": "wiki-page-name", "required": true, "example": "Article name" }, "2": { "label": "Page 2", "description": "The name of the second page that you want to link to.", "type": "wiki-page-name", "required": false }, "3": { "label": "Page 3", "description": "The name of the third page that you want to link to. More pages can be added using the parameters \"4\", \"5\", \"6\", etc.", "type": "wiki-page-name", "required": false }, "label 1": { "label": "Label 1", "type": "string", "description": "What the first linked article is to be displayed as. ", "aliases": [ "l1" ] }, "label 2": { "label": "Label 2", "type": "string", "description": "What the second linked article is to be displayed as.", "aliases": [ "l2" ] }, "label 3": { "aliases": [ "l3" ], "type": "string", "label": "Label 3", "description": "What the third linked article is to be displayed as. Other labels can be added by using increasing numbers (starting with \"label 4\" or \"l4\" for page 4) as parameter names." }, "selfref": { "type": "boolean", "label": "Self reference", "description": "Set to \"yes\" if the template is a self-reference to Wikipedia that would not make sense on mirrors or forks of the Wikipedia site.", "example": "yes", "default": "no" }, "category": { "label": "Category", "description": "Set to \"no\", \"n\", \"false\", or \"0\" to suppresses the error tracking category (Category:Hatnote templates with errors). This only has an effect if no page names are specified.", "type": "boolean", "default": "yes", "example": "no" } }, "format": "inline" } </templatedata> {{Collapse bottom}} ==See also== *{{tl|For}} *{{tl|See also if exists}} *{{t|Further}} *{{tl|Template see also}} *{{tl|Category see also}} *{{tl|Main}} *{{tl|See}} (redirect to {{tl|Further}}) *{{tl|Hatnote}} {{Hatnote templates}} <includeonly>{{Sandbox other|| <!-- Categories go here and interwikis go in Wikidata. --> [[Category:Hatnote templates]] [[Category:Related-topic templates]] [[Category:Wikipedia page-section templates]] [[Category:Wikipedia see also]] }}</includeonly> 8e7cb32ca0af3f18a7bc8a6a67105914d660c533 Module:Labelled list hatnote 828 271 360 2023-11-09T15:12:36Z Silentg 2 Created page with "-------------------------------------------------------------------------------- -- Labelled list -- -- -- -- This module does the core work of creating a hatnote composed of a list -- -- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", -- -- for {{see also}} and similar templates...." Scribunto text/plain -------------------------------------------------------------------------------- -- Labelled list -- -- -- -- This module does the core work of creating a hatnote composed of a list -- -- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", -- -- for {{see also}} and similar templates. -- -------------------------------------------------------------------------------- local mHatnote = require('Module:Hatnote') local mHatlist = require('Module:Hatnote list') local mArguments --initialize lazily local yesno --initialize lazily local p = {} -- Defaults global to this module local defaults = { label = 'See also', --Final fallback for label argument labelForm = '%s: %s', prefixes = {'label', 'label ', 'l'}, template = 'Module:Labelled list hatnote' } -- Localizable message strings local msg = { errorSuffix = '#Errors', noInputWarning = 'no page names specified', noOutputWarning = "'''[[%s]] — no output: none of the target pages exist.'''" } -- Helper function that pre-combines display parameters into page arguments. -- Also compresses sparse arrays, as a desirable side-effect. function p.preprocessDisplays (args, prefixes) -- Prefixes specify which parameters, in order, to check for display options -- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1' prefixes = prefixes or defaults.prefixes local indices = {} local sparsePages = {} for k, v in pairs(args) do if type(k) == 'number' then indices[#indices + 1] = k local display for i = 1, #prefixes do display = args[prefixes[i] .. k] if display then break end end sparsePages[k] = display and string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v end end table.sort(indices) local pages = {} for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end return pages end --Helper function to get a page target from a processed page string --e.g. "Page|Label" → "Page" or "Target" → "Target" local function getTarget(pagename) local pipe = string.find(pagename, '|') return string.sub(pagename, 0, pipe and pipe - 1 or nil) end -- Produces a labelled pages-list hatnote. -- The main frame (template definition) takes 1 or 2 arguments, for a singular -- and (optionally) plural label respectively: -- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}} -- The resulting template takes pagename & label parameters normally. function p.labelledList (frame) mArguments = require('Module:Arguments') yesno = require('Module:Yesno') local labels = {frame.args[1] or defaults.label} labels[2] = frame.args[2] or labels[1] labels[3] = frame.args[3] --no defaulting labels[4] = frame.args[4] --no defaulting local template = frame:getParent():getTitle() local args = mArguments.getArgs(frame, {parentOnly = true}) local pages = p.preprocessDisplays(args) local options = { category = yesno(args.category), extraclasses = frame.args.extraclasses, ifexists = yesno(frame.args.ifexists), namespace = frame.args.namespace or args.namespace, selfref = yesno(frame.args.selfref or args.selfref), template = template } return p._labelledList(pages, labels, options) end function p._labelledList (pages, labels, options) if options.ifexists then for k = #pages, 1, -1 do --iterate backwards to allow smooth removals local v = pages[k] local title = mw.title.new(getTarget(v), namespace) if (v == '') or title == nil or not title.exists then table.remove(pages, k) end end end labels = labels or {} label = (#pages == 1 and labels[1] or labels[2]) or defaults.label for k, v in pairs(pages) do if mHatnote.findNamespaceId(v) ~= 0 then label = ( #pages == 1 and (labels[3] or labels[1] or defaults.label) or (labels[4] or labels[2] or defaults.label) ) or defaults.label end end if #pages == 0 then if options.ifexists then mw.addWarning( string.format( msg.noOutputWarning, options.template or defaults.template ) ) return '' else return mHatnote.makeWikitextError( msg.noInputWarning, (options.template or defaults.template) .. msg.errorSuffix, options.category ) end end local text = string.format( options.labelForm or defaults.labelForm, label, mHatlist.andList(pages, true) ) local hnOptions = { extraclasses = options.extraclasses, selfref = options.selfref } return mHatnote._hatnote(text, hnOptions) end return p b7a8ba27cf6195e6427701b94e8d2acad3c40a21 Module:Labelled list hatnote/doc 828 272 361 2023-11-09T15:13:01Z Silentg 2 Created page with "{{module rating|protected}} {{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{Lua|Module:Hatnote|Module:Hatnote list|Module:Arguments}} This module provides a handful of functions that make it easy to implement hatnotes that take the form of a label in front of a list of pages, e.g. {{hatnote|LABEL: [[A]], [[B]], and [[C]]}} == Usage == ===labelledList=== Invoking the <code>labelledList()</code> function is enough to implement most such templates: <code><now..." wikitext text/x-wiki {{module rating|protected}} {{used in system|in [[MediaWiki:Wantedpages-summary]]}} {{Lua|Module:Hatnote|Module:Hatnote list|Module:Arguments}} This module provides a handful of functions that make it easy to implement hatnotes that take the form of a label in front of a list of pages, e.g. {{hatnote|LABEL: [[A]], [[B]], and [[C]]}} == Usage == ===labelledList=== Invoking the <code>labelledList()</code> function is enough to implement most such templates: <code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Universal label}}</nowiki></code> or <code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}</nowiki></code> For example, providing "See also" instead of "Universal label" duplicates the functionality of {{tl|see also}}, while providing "Main article" and "Main articles" instead of "Singular label" and "Plural label" duplicates the (article namespace) functionality of {{tl|main}}. If third and fourth labels are provided, they'll be used in the case where any of the target pages are outside the article namespace, so e.g. {{tl|main}} can be implemented thus: <code><nowiki>{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}}</nowiki></code> ===preprocessDisplays=== The <code>preprocessDisplays()</code> function takes a raw list of arguments and combines in any display arguments. For example, {{tlx|see also|1|<nowiki>l1=One</nowiki>}} initially has the arguments table <code><nowiki>{'1', ['l1'] = 'One'}</nowiki></code>; this table would combine those into the table <code><nowiki>{'1|One'}</nowiki></code>. It overrides manual piping (e.g. {{tlx|see also|<nowiki>1{{!}}2</nowiki>|<nowiki>l1=One</nowiki>}} → <code><nowiki>{'1|One'}</nowiki></code>) and compresses sparse arrays if a parameter is skipped or left empty. Example: <syntaxhighlight lang="lua"> local mLabelledList = require('Module:Labelled list hatnote') local pages = mLabelledList.preprocessDisplays(args) </syntaxhighlight> ===_labelledList=== For modules that need to modify the functionality slightly while still using it, <code>_labelledList()</code> provides some flexibility. It takes three parameters: # A pages list, preferably preprocessed and compressed by <code>preprocessDisplays</code> # A labels table, where the first item is the singular or universal label, and the second either a plural label or a copy of the first. # An options table, preferably containing: #* a <code>template</code> string with the full title of the template. Defaults to the title of this module. #* a <code>category</code> string (or nil) as taken by <code>makeWikitextError</code> from [[Module:Hatnote]], to optionally disable error categories #* a <code>selfref</code> string (or nil) as taken by <code>_hatnote</code> to enable the selfref option Example: <syntaxhighlight lang="lua"> local mLabelledList = require('Module:Labelled list hatnote') return mLabelledList._labelledList(pages, labels, options) </syntaxhighlight> ==Errors== This module causes templates based on it to produce an error message if no page names are provided as template parameters. Normally, these should lead back to "Errors" sections in the documentation of those templates. However, if those templates use a module with <code>_labelledList()</code> and don't provide a <code>template</code> item in their options table, that error defaults to leading back here. The error can be solved by providing at least one valid page-name parameter to the template in question; the problem in the template can be fixed by providing some value to the <code>template</code> item of the <code>_labelledList()</code> <code>options</code> table. <includeonly>{{sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Hatnote modules| ]] }}</includeonly> 7d283cc53e4db97f97b4fee7c83cd5b4cc64641b Category:Masks 14 273 364 2023-11-10T14:31:44Z Silentg 2 Created page with "A category of all the masks in the game." wikitext text/x-wiki A category of all the masks in the game. 621c37240992f6048e76dc7afb82588061c3d8c5 368 364 2023-11-10T14:44:14Z Silentg 2 wikitext text/x-wiki A category of all the [[Masks|masks]] in the game. 45c2436eed7690de02ab1dbb68165b4b554df8d4 Category:Page templates 14 274 365 2023-11-10T14:33:26Z Silentg 2 Created page with "A category of templates used to help in the creation of copy-pasteable pages." wikitext text/x-wiki A category of templates used to help in the creation of copy-pasteable pages. 4993ae228c94cee8befcf6b80d9c557c659abbb5 Skull Crest Mask 0 217 366 292 2023-11-10T14:35:08Z Silentg 2 wikitext text/x-wiki {{Mask | name = Skull Crest Mask | description = A mask bearing a festive face that fills you with a fondness for mischief. | location = [[Refinery Overlook]] - [[Level 4 Ending]] North | price = 400 | lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a human skull without the jaws. There are also glowing circular eyes. | obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot. * To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies. * You can also reach it by advancing from [[Refinery Overlook]] normally. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Skull Crest Mask Icon.png |The In-game icon of the mask Skull Crest Mask Location.png|The surrounding of the location of the mask Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. *The skull has a resemblance to the common depiction of the skull emoji. }} 5a54d1f70ea79d25ce3bd5c80ccce1d01aadac88 370 366 2023-11-10T14:47:43Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Skull Crest Mask | description = A mask bearing a festive face that fills you with a fondness for mischief. | location = [[Refinery Overlook]] - [[Level 4 Ending]] North | price = 400 | lead = The '''Skull Crest Mask''' is one of the 7 Halloween masks released in October 2023. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a cartoonish depiction of the human skull without the jaws. There are also glowing circular eyes. | obtain = *It is located on a giant pipe in between [[Refinery Overlook]] and [[Level 4 Ending]] and it quite easy to spot. * To get to it, you can go to [[Level 4 Ending]] then fall down Eastward on to the giant pipe where the mask lies. * You can also reach it by advancing from [[Refinery Overlook]] normally. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Skull Crest Mask Icon.png |The In-game icon of the mask Skull Crest Mask Location.png|The surrounding of the location of the mask Skull Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. *The skull has a resemblance to the common depiction of the skull emoji. }} 2aeb1d938675f1336cfebfa65d9865cc0b8dc18a Template:Mask 10 192 367 346 2023-11-10T14:39:42Z Silentg 2 type update wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}} ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Masks]]{{#switch:{{{type|}}}|normal=[[Category:Normal masks]]|challenge=[[Category:Challenge masks]]|seasonal=[[Category:Seasonal masks]]|misc=[[Category:Miscellaneous masks]]}}</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 2e6ece11ca82d4f3f224a173e8afd7041edcdbc6 Template:Mask/doc 10 200 369 266 2023-11-10T14:44:37Z Silentg 2 wikitext text/x-wiki This template is used as a blueprint to create articles for [[Masks|masks]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Mask | type = | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; type : The type of the mask. Only accepts these parameters: <tt>normal</tt>, <tt>challenge</tt>, <tt>seasonal</tt>, <tt>misc</tt> ; name : The name of the mask. ; description : The in-game description of the mask. ; location : ; price : The price the player has to pay. ; lead : A short summary of the mask. ; appearance : Describe the mask's appearance as best as possible. ; obtain : A bulleted list containing various methods to obtain the mask. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the mask. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the mask. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> bda0bf7cb12e5de22ba1f59cd19e3acf1ef29cdf Category:Seasonal masks 14 275 371 2023-11-10T14:48:43Z Silentg 2 Created page with "A category of all seasonal masks, masks that are only obtainable during a certain annual season or event. [[Category:Masks]]" wikitext text/x-wiki A category of all seasonal masks, masks that are only obtainable during a certain annual season or event. [[Category:Masks]] 9e3af3c6668037fc7872cc09e54f67e337c840ab Jack O’ Lantern Crest Mask 0 191 372 271 2023-11-10T14:50:14Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Jack O’ Lantern Crest Mask | description = A mask bearing a festive face that fills you with a fondness for sweets. | location = [[Abyssal Sanctum Market]] - [[Beginner's Grotto]] | price = 400 | lead = The '''Jack O' Lantern Crest Mask''' is one of the 7 Halloween masks released in October 2023. It is the easiest Halloween mask to obtain compared to the others, therefore making it the most common Halloween mask to be seen worn by players. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It resembles a [[wikipedia:Jack-o'-lantern|jack O’ lantern]], having a jagged mouth, a triangle-shaped nose, and circle-shaped eyes. | obtain = *It is located on top of a non-smoking chimney on top of the "ABYSSAL ENERGY EXCHANGE" shop that lies in [[Abyssal Sanctum Market]]. *To get to it, you can fall down with [[Techs|Cancel Velocity]] from [[Sanctum Overlook]] to land on top of the gigantic blue potion bottle and repeat to reach the mask, or alternatively [[Mechanics|Dash]] to it. *You can also simply climb up with Double jump charges from another person or the tutorial NPCs in the small gate. *You can fall down from the bridge before [[Witness Store]] to directly land on the item. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Jack O’ Lantern Crest Mask Icon.png|The In-game icon of the mask Jack O’ Lantern Crest Mask Location.png|The surrounding of the location of the mask Jack O’ Lantern Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 979753e63f966a8d0a67f71c8152a29aeb608527 Owl Crest Mask 0 196 373 273 2023-11-10T14:50:28Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Owl Crest Mask | description = A mask with the face of a long-forgotten creature from the surface. | location = [[The First Gate]] | price = 400 | lead = The '''Owl Crest Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is the least Halloween related mask among the 7 as the "beak" of the mask can be misinterpret as a happy mouth. | appearance = The Appearance of the mask is inverted compared to it's icon, similar to many other masks. The Owl Crest Mask have 2 eyes with pupils. There's also a "beak" which is a simple triangle shape. | obtain = *It lies on a bridge directly below [[The First Gate]] and can be easily spotted. *You can get there by simply dropping down from the East side of the bridge in [[The First Gate]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Owl Crest Mask Icon.png|The In-game icon of the mask Owl Crest Mask Location.png|The surrounding of the location of the mask Owl Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} ce9f5b15066c1b3d8907281ab836ed48be98942c Moonlight Pico Mask 0 201 374 274 2023-11-10T14:50:52Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Moonlight Pico Mask | description = Bearing the visage of a werewolf-colored dragon, you feel scared just touching it. | location = Near below [[Level 3 Ascent]] | price = 400 | lead = The '''Moonlight Pico Mask''' is one of the 7 obtainable Halloween mask that were released in October 2023. This mask is one of the hardest mask to find among the 7 for the fact that it doesn't glow like the others. | appearance = This mask has the shape of a brown-colored pico dragon from the game [https://cloudygamesllc.itch.io/dragon-drop Dragon Drop]. | obtain = *It is located behind a tree in an empty place under the "Wooden Branches" section in between [[Level 3 Ascent]] and [[Tower of Isolation]](On the East part of the map). * To get to it, you can go to the "Wooden Branches" section and fall down from there, landing on the empty place where the mask lies. * You can also teleport to [[Level 3 Ascent]] go Southeast and fall down to the zone there. * You can also go from [[Bridge of Connection]] and fall down from there to the same place. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Moonlight Pico Mask Icon.png|The In-game icon of the mask Moonlight Pico Mask Location.png|The surrounding of the location of the mask Moonlight Pico Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This Mask's icon have a tint of light blue on it, while the actual mask is simply a brown pico mask. *This Mask was initially intended to not be seasonal, however due to some certain players, it ended up being seasonal. }} fe28836f2ef0a7614c81241860f9047b8b53d13d Ghost Crest Mask 0 205 375 278 2023-11-10T14:54:33Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Ghost Crest Mask | description = A spooky mask featuring a spooky ghost. You try not to tremble with terror holding it. | location = [[Floor 4 Beginning]] | price = 400 | lead = The '''Ghost Crest Mask''' is one of the 7 Halloween masks released in October 2023. OOOooooOOoo SpO0okyyy... | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. It's shapes resembles that of a ghost, but with small glowing eyes, making it rather...cute. | obtain = *It is located right under the start of the conveyor belt going from [[Floor 4 Beginning]]. *To get it, go to [[Floor 4 Beginning]] and drop down at the direction of the conveyor belt(West). | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Ghost Crest Mask Icon.png|The In-game icon of the mask Ghost Crest Mask Location.png|The surrounding of the location of the mask Ghost Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} 8d59650ac9891a5d802d73b91be67222870d8585 Creepy Smile Crest Mask 0 209 376 282 2023-11-10T14:55:17Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Creepy Smile Crest Mask | description = A mask that only has an unnerving grin on it, wear it at your own risk. | location = Above [[Bridge of Connection]] | price = 400 | lead = The '''Creepy Smile Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's also the easiest mask to miss among the 7 if you don't keep an eye out. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. The mask only have a stripped smile in the middle of it. | obtain = *It is located right above the little roof above the checkpoint at [[Bridge of Connection]]. *You can reach it by simply going to [[Refinery Overlook]] and going in reverse(North) to fall down on the roof where the mask lies. *You can also [[Techs|Double Jump Stack]] up with another player from [[Bridge of Connection]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Creepy Smile Crest Mask Icon.png|The In-game icon of the mask Creepy Smile Crest Mask Location.png|The surrounding of the location of the mask Creepy Smile Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} a63169d261b1a3123fc9565c0d02972fdb277ba1 Evil Eye Crest Mask 0 213 377 288 2023-11-10T14:55:47Z Silentg 2 wikitext text/x-wiki {{Mask | type = seasonal | name = Evil Eye Crest Mask | description = A mask with a single terrifying, it peers into your soul. | location = [[Refinery Overlook]] - [[Level 4 Ending]] Southwest | price = 400 | lead = The '''Evil Eye Crest Mask''' is one of the 7 Halloween masks released in October 2023. It's not so evil as it sounds. | appearance = The appearance of the mask is inverted compared to its icon, similar to many other masks. Different from [[Mask of Truth]], it features a circular eye with demon-like pupil in it. | obtain = *It is located in the Southwest, below the end of the conveyor that starts from [[Refinery Outlook]]. *To get to it, simply go to [[Refinery Outlook]], ride the conveyor until you're at the end of it, and then drop down to the pipe that supports that conveyor. The mask will be in between 2 vertical supporting pipes. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Evil Eye Crest Mask Icon.png|The In-game icon of the mask Evil Eye Crest Mask Location.png|The surrounding of the location of the mask Evil Eye Crest Mask Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This mask has no real significance to the lore despite its description. }} c99e51e2089f1153bd1c2e3933104738bfe5843b MediaWiki:Sidebar 8 164 378 190 2023-11-12T15:45:42Z Reduckilous 4 Adding the upload wizard page into the sidebar wikitext text/x-wiki * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** Special:UploadWizard|Bulk Upload files * SEARCH * TOOLBOX * LANGUAGES 9e2a58e1df746c6a6df2d3eb09f64b0a22565d87 Dyes 0 218 379 293 2023-11-24T13:39:05Z Reduckilous 4 wikitext text/x-wiki == Normal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffb5b4" | [[Red Dye|Red]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#fdfff7" | [[Green Dye|Green]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#ffff07" | [[Yellow Dye|Yellow]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#e7feff" | [[Blue Dye|Blue]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#05ffff" | [[Cyan Dye|Cyan]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#ff02ff" | [[Purple Dye|Purple]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#fffdff" | [[Pink Dye|Pink]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#b702ff" | [[Violet Dye|Violet]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ffedf3" | [[Light Red Dye|Light Red]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#fdff05" | [[Lime Dye|Lime]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |} == Seasonal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffe03c" | [[Orange Dye|Orange]] |[[Sanctum Overlook]], next to the NPC with the same dye color. |72 |Easy |} 55b7c01a846f1f1f6ed9bbf22d438ea8195e0af2 Template:Dyes 10 276 380 2023-11-24T14:23:24Z Reduckilous 4 Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = {{{minhex|}}} | label2 = Max Graphic Hex | data2 = {{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDI..." wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = {{{minhex|}}} | label2 = Max Graphic Hex | data2 = {{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Dyes]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 2940e79cdc025f50fbdb3dc033dac504cb6911e5 383 380 2023-11-24T15:00:58Z Reduckilous 4 wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = <nowiki>{{{minhex|}}}</nowiki> | label2 = Max Graphic Hex | data2 = <nowiki>{{{maxhex|}}}</nowiki> | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Dyes]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 472d85686633bc4e711bfa6c620f36eb1c0d2aff 384 383 2023-11-24T15:28:49Z Reduckilous 4 Undo revision 383 by [[Special:Contributions/Reduckilous|Reduckilous]] ([[User talk:Reduckilous|talk]]) wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = {{{minhex|}}} | label2 = Max Graphic Hex | data2 = {{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Dyes]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 2940e79cdc025f50fbdb3dc033dac504cb6911e5 Template:Dyes/doc 10 277 381 2023-11-24T14:32:06Z Reduckilous 4 Created page with "This template is used as a blueprint to create articles for [[Dyes|dyes]]. == Usage == See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Dyes | name = | minhex = | maxhex = | location = | price = | lead = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the dye. ; location : ; price : The price the player has to pay. ; le..." wikitext text/x-wiki This template is used as a blueprint to create articles for [[Dyes|dyes]]. == Usage == See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Dyes | name = | minhex = | maxhex = | location = | price = | lead = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the dye. ; location : ; price : The price the player has to pay. ; lead : A short summary of the dye. ; obtain : A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the dye. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> 91fb0bc4e5d44f578848bbcd38c7322058af3c1c 385 381 2023-11-24T15:36:17Z Reduckilous 4 wikitext text/x-wiki This template is used as a blueprint to create articles for [[Dyes|dyes]]. == Usage == See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Dyes | name = | minhex = | maxhex = | location = | price = | lead = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the dye. ; minhex : The hex value of the color display when the game's graphic is put the minimum. Please use <nowiki><nowiki></nowiki> and <nowiki></nowiki></nowiki> to surround the hex code to avoid the tag turning into a numbered list. ; minhex : The hex value of the color display when the game's graphic is put the maximum. Please use <nowiki><nowiki></nowiki> and <nowiki></nowiki></nowiki> to surround the hex code to avoid the tag turning into a numbered list. ; location : ; price : The price the player has to pay. ; lead : A short summary of the dye. ; obtain : A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the dye. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> 42b8df373c2059329334c0f3a0f3a078171adbef Orange Dye 0 226 382 302 2023-11-24T14:47:07Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Orange Dye | minhex = #3472AD | maxhex = #ffe03c | location = [[Sanctum Overlook]] | price = 0 | lead = The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color. | obtain = *It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Orange Dye Bottle.png|The Dye Bottle Orange Dye Showcase.png|Showcasing the Dye without accessories Orange Dye Full Showcase.png|Showcasing the Dye with accessories Orange Dye Witness.png|A Witness with the dye Orange Dye Location.png|The Dye's location </gallery> | trivia = *The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released. }} b5e03c83a4ffa1325833796267e61b81b65f3ad3 386 382 2023-11-24T15:37:28Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Orange Dye | minhex = <nowiki>#3472AD</nowiki> | maxhex = <nowiki>#ffe03c</nowiki> | location = [[Sanctum Overlook]] | price = 0 | lead = The Orange Dye is the first ever seasonal dye to ever exist. It gives off a warm color. | obtain = *It is located in [[Sanctum Overlook]] and is next to an [[Co-op helper|Orange NPC]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Orange Dye Bottle.png|The Dye Bottle Orange Dye Showcase.png|Showcasing the Dye without accessories Orange Dye Full Showcase.png|Showcasing the Dye with accessories Orange Dye Witness.png|A Witness with the dye Orange Dye Location.png|The Dye's location </gallery> | trivia = *The Orange Dye gives out the [[Brown Dye]] by mistake when it was first released. }} 11e31fe7599e435f9d377e771715b254f18b9afc File:Blue Dye Bottle.png 6 278 387 2023-11-24T17:06:30Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Blue Dye Bottle}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} e2e75483c72738d9a591b8874e72e614f26293e3 File:Blue Dye Showcase.png 6 279 388 2023-11-24T17:06:30Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Blue Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 418762ddd964684f28000135ec9fb10fb46c13bd File:Blue Dye Full Showcase.png 6 280 389 2023-11-24T17:06:30Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Blue Dye Showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 26ce6330c16b925b09e1ef8e3ef22dd3e74c6979 File:Green Dye Bottle.png 6 281 390 2023-11-24T17:06:32Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Green Dye Showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} c85d4e71fe33a143bc99cc20249057cfeb00293a File:Blue Dye.png 6 282 391 2023-11-24T17:06:34Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Blue Dye Showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 26ce6330c16b925b09e1ef8e3ef22dd3e74c6979 File:Green Dye Full Showcase.png 6 283 392 2023-11-24T17:06:34Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Green Dye Showcase.png 6 284 393 2023-11-24T17:06:36Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Green Dye.png 6 285 394 2023-11-24T17:06:36Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Red Dye Bottle.png 6 286 395 2023-11-24T17:06:38Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Red Dye Full Showcase.png 6 287 396 2023-11-24T17:06:42Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Red Dye Location.png 6 288 397 2023-11-24T17:06:42Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Red Dye Showcase.png 6 289 398 2023-11-24T17:06:42Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Yellow Dye Bottle.png 6 290 399 2023-11-24T17:06:48Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Red Dye.png 6 291 400 2023-11-24T17:06:49Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Yellow Dye Showcase.png 6 292 401 2023-11-24T17:06:56Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Yellow Dye.png 6 293 402 2023-11-24T17:06:56Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f File:Yellow Dye Full Showcase.png 6 294 403 2023-11-24T17:06:59Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Dye showcase}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} f124121e6210149b71c1ac7236effb5f8410af5f Red Dye 0 295 404 2023-11-24T17:08:19Z Reduckilous 4 Created page with "{{Dyes | name = Red Dye | minhex = <nowiki>#ff9797</nowiki> | maxhex = <nowiki>#ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|..." wikitext text/x-wiki {{Dyes | name = Red Dye | minhex = <nowiki>#ff9797</nowiki> | maxhex = <nowiki>#ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|Showcasing the Dye without accessories Red Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 244c532274242a39379798f448db7d3105245b39 405 404 2023-11-24T17:11:54Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Red Dye | minhex = <nowiki>#ff9797</nowiki> | maxhex = <nowiki>#ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|Showcasing the Dye without accessories Red Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} f69254abb8ebd2d255d07c3ea4504b75cb7b17f0 Green Dye 0 296 406 2023-11-24T17:12:03Z Reduckilous 4 Created page with "{{Dyes | name = Green Dye | minhex = <nowiki>#faffef</nowiki> | maxhex = <nowiki>#fdfff7</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Green Dye Bottle.png|The Dye Bottle Green Dye Sho..." wikitext text/x-wiki {{Dyes | name = Green Dye | minhex = <nowiki>#faffef</nowiki> | maxhex = <nowiki>#fdfff7</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Green Dye Bottle.png|The Dye Bottle Green Dye Showcase.png|Showcasing the Dye without accessories Green Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} e4935c81e519fa74b474948a40669b5f620a41ee Yellow Dye 0 297 407 2023-11-24T17:14:30Z Reduckilous 4 Created page with "{{Dyes | name = Yellow Dye | minhex = <nowiki>#fffd02</nowiki> | maxhex = <nowiki>#ffff07</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Yellow Dye Bottle.png|The Dye Bottle Yellow Dye..." wikitext text/x-wiki {{Dyes | name = Yellow Dye | minhex = <nowiki>#fffd02</nowiki> | maxhex = <nowiki>#ffff07</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Yellow Dye Bottle.png|The Dye Bottle Yellow Dye Showcase.png|Showcasing the Dye without accessories Yellow Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 9e662fa5c9beeac89f01cba1dcd6896f4026226c Blue Dye 0 298 408 2023-11-24T17:15:59Z Reduckilous 4 Created page with "{{Dyes | name = Blue Dye | minhex = <nowiki>#ccfaff</nowiki> | maxhex = <nowiki>#e7feff</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Blue Dye Bottle.png|The Dye Bottle Blue Dye Showcas..." wikitext text/x-wiki {{Dyes | name = Blue Dye | minhex = <nowiki>#ccfaff</nowiki> | maxhex = <nowiki>#e7feff</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Blue Dye Bottle.png|The Dye Bottle Blue Dye Showcase.png|Showcasing the Dye without accessories Blue Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 909a9bdc3bd6074694ec2d8fcb71adb1fc7832fa File:Deep Purple Dye Full Showcase.png 6 299 409 2023-11-25T13:22:56Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 421 409 2023-11-25T13:48:13Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Full Showcase.png]] to [[File:Deep Purple Dye Full Showcase.png]]: Misspelled title wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 File:Deep Purple Dye Bottle.png 6 300 410 2023-11-25T13:22:56Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 423 410 2023-11-25T13:48:22Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Bottle.png]] to [[File:Deep Purple Dye Bottle.png]]: Misspelled title wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 File:Deep Purple Dye Location.png 6 301 411 2023-11-25T13:22:57Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 419 411 2023-11-25T13:48:05Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Location.png]] to [[File:Deep Purple Dye Location.png]]: Misspelled title wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 File:Deep Purple Dye Showcase.png 6 302 412 2023-11-25T13:23:01Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 415 412 2023-11-25T13:47:08Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Showcase.png]] to [[File:Deep Purple Dye Showcase.png]] wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 File:Deep Purple Dye.png 6 303 413 2023-11-25T13:23:02Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 417 413 2023-11-25T13:47:56Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple.png]] to [[File:Deep Purple Dye.png]]: Misspelled title wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Image for the Dyes}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 3200fd08b7d967a78f6814853006205d9f117423 Dyes 0 218 414 379 2023-11-25T13:39:57Z Reduckilous 4 adding purple wikitext text/x-wiki == Normal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffb5b4" | [[Red Dye|Red]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#fdfff7" | [[Green Dye|Green]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#ffff07" | [[Yellow Dye|Yellow]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#e7feff" | [[Blue Dye|Blue]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#05ffff" | [[Cyan Dye|Cyan]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#ff02ff" | [[Purple Dye|Purple]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#fffdff" | [[Pink Dye|Pink]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#b702ff" | [[Violet Dye|Violet]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ffedf3" | [[Light Red Dye|Light Red]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#fdff05" | [[Lime Dye|Lime]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]] |Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]] |0 |Medium |} == Seasonal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffe03c" | [[Orange Dye|Orange]] |[[Sanctum Overlook]], next to the NPC with the same dye color. |72 |Easy |} 2621adfbaa0c979279e149929a11df7de47ddbf2 File:Deep Purple Showcase.png 6 304 416 2023-11-25T13:47:08Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Showcase.png]] to [[File:Deep Purple Dye Showcase.png]] wikitext text/x-wiki #REDIRECT [[File:Deep Purple Dye Showcase.png]] 4032c2e02fc49d35c800a17e7ef0e85cc3d82058 File:Deep Purple.png 6 305 418 2023-11-25T13:47:56Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple.png]] to [[File:Deep Purple Dye.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Deep Purple Dye.png]] 8aa5443661f288a5b3622e1b7ed68c7a00027e45 File:Deep Purple Location.png 6 306 420 2023-11-25T13:48:05Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Location.png]] to [[File:Deep Purple Dye Location.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Deep Purple Dye Location.png]] b2f2cacebd8d800d2faa3b4803d216a0264863b8 File:Deep Purple Full Showcase.png 6 307 422 2023-11-25T13:48:13Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Full Showcase.png]] to [[File:Deep Purple Dye Full Showcase.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Deep Purple Dye Full Showcase.png]] 089bff975325fca4b4f6066e6e6d93e091530c9a File:Deep Purple Bottle.png 6 308 424 2023-11-25T13:48:22Z Reduckilous 4 Reduckilous moved page [[File:Deep Purple Bottle.png]] to [[File:Deep Purple Dye Bottle.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Deep Purple Dye Bottle.png]] 554a4f766348fc66ffe4c629195de8100b083449 Deep Purple Dye 0 309 425 2023-11-25T13:49:29Z Reduckilous 4 Created page with "{{Dyes | name = Deep Purple Dye | minhex = <nowiki>#6301d5</nowiki> | maxhex = <nowiki>#6300d5</nowiki> | location = [[Abyssal Sanctum Market]] | price = 800 | lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn. | obtain = *It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]]. | gallery = <gallery style="background-color:#0B2347; width:53%;..." wikitext text/x-wiki {{Dyes | name = Deep Purple Dye | minhex = <nowiki>#6301d5</nowiki> | maxhex = <nowiki>#6300d5</nowiki> | location = [[Abyssal Sanctum Market]] | price = 800 | lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn. | obtain = *It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Deep Purple Dye Bottle.png|The Dye Bottle Deep Purple Dye Showcase.png|Showcasing the Dye without accessories Deep Purple Dye Full Showcase.png|Showcasing the Dye with accessories Deep Purple Dye Location.png|The Dye's location </gallery> }} a5c6c84613a4cd3dc682b71bf3107a1af9f2e4ed Category:Wings 14 310 426 2023-11-25T14:01:14Z Reduckilous 4 Created page with "Category of all [[Wings]] in the game." wikitext text/x-wiki Category of all [[Wings]] in the game. 9b824a5fcfc56972abb393ce4c10cda27c461cc9 Template:Wings 10 311 427 2023-11-25T14:14:14Z Reduckilous 4 Created page with "<includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}}..." wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = In-Game Description | data1 = {{{description|}}} | label2 = Location | data2 = {{{location|}}} | label3 = Price | data3 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Appearance== {{{appearance|}}} ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Wings]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> 0b2d4277a34d5804d4401fdac7a9ce99ab334eb3 Template:Wings/doc 10 312 428 2023-11-25T14:21:12Z Reduckilous 4 Created page with "This template is used as a blueprint to create articles for [[Wings|wings]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Wing | type = | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the wing. ; description : The in-game description of..." wikitext text/x-wiki This template is used as a blueprint to create articles for [[Wings|wings]]. == Usage == See [[Template:Mask/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Wing | type = | name = | description = | location = | price = | lead = | appearance = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the wing. ; description : The in-game description of the wing. ; location : ; price : The price the player has to pay. ; lead : A short summary of the wing. ; appearance : Describe the wing's appearance as best as possible. ; obtain : A bulleted list containing various methods to obtain the wing. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the wing. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the wing. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> 957b4fcfb22ed1d52bee1282dbbbcc513a5b2594 File:Large Ring Wing.png 6 313 429 2023-11-25T16:36:00Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Void Cape.png 6 314 430 2023-11-25T16:36:00Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Guardian Wings.png 6 315 431 2023-11-25T16:36:01Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Megaannum Wings.png 6 316 432 2023-11-25T16:36:04Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Tulip Wing.png 6 317 433 2023-11-25T16:36:05Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Bee Wings.png 6 318 434 2023-11-25T16:36:05Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Souldeer Wings.png 6 319 435 2023-11-25T16:36:07Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Nix's Wings.png 6 320 436 2023-11-25T16:36:07Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Neon Whale.png 6 321 437 2023-11-25T16:36:09Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Warped Wings.png 6 322 438 2023-11-25T16:36:14Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Wings of the Fallen.png 6 323 439 2023-11-25T16:36:14Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Lilith's Wings.png 6 324 440 2023-11-25T16:36:16Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Runic Wings.png 6 325 441 2023-11-25T16:36:21Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 449 441 2023-11-26T08:02:59Z Reduckilous 4 Reduckilous moved page [[File:Runic's Wings.png]] to [[File:Runic Wings.png]]: Misspelled title wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Wings of Possession.png 6 326 442 2023-11-25T16:36:21Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Glider Wing.png 6 327 443 2023-11-25T16:36:25Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Rei's Wing.png 6 328 444 2023-11-25T16:36:28Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Scaled Shell.png 6 329 445 2023-11-25T16:36:29Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Cape Wing Blue.png 6 330 446 2023-11-25T16:36:32Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 File:Abital's Wings.png 6 331 447 2023-11-25T16:36:35Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Abyssal wing}} |date=2023-11-25 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} 9764ecab596fd2c7d3a6daab547931d829960ff3 Wings 0 332 448 2023-11-25T18:33:17Z Reduckilous 4 Created page with "{{See also|Masks|Dyes}} Wings are one of the three main cosmetics in the game. ==Normal Wings== Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B234..." wikitext text/x-wiki {{See also|Masks|Dyes}} Wings are one of the three main cosmetics in the game. ==Normal Wings== Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Glider Wing]] | [[File:Glider Wing.png|100px|link=[[Glider Wing]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Tulip Wing]] | [[File:Tulip Wing.png|100px|link=[[Tulip Wing]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Nix's Wings]] | [[File:Nix's Wings.png|100px|link=[[Nix's Wings]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Warped Wings]] | [[File:Warped Wings.png|100px|link=[[Warped Wings]]]] | * Located behind a big broken pillar on the East of the map, ground floor. |0 |Medium |- | [[Megaannum Wings]] | [[File:Megaannum Wings.png|100px|link=[[Megaannum Wings]]]] | * Located at the end of the "Orb vault" in the South of [[Plinko Overlook]]. |324 |Easy |- | [[Large Ring Wing]] | [[File:Large Ring Wing.png|100px|link=[[Large Ring Wing]]]] | * Located under the small parkour section North of [[Witness Store]] which can be directly dropped down into. |247 |Easy |- | [[Lilith's Wings]] | [[File:Lilith's Wings.png|100px|link=[[Lilith's Wings]]]] | * Located near under the [[Witness Store]] and behind a pillar. * Can be obtained by going East from [[Witness Store]] and drop down to the support beams section far above [[Sanctum Overlook]]. |196 |Medium |- | [[Scaled Shell]] | [[File:Scaled Shell.png|100px|link=[[Scaled Shell]]]] | * Located in the center of 4 pillars, on the West from under the bridge before [[The Second Gate]]. |321 |Easy |- | [[Wings of the Fallen]] | [[File:Wings of the Fallen.png|100px|link=[[Wings of the Fallen]]]] | * Located in a small hall way next to a room with an echo, on the upper Southeast from [[Witness Store]]. * Can be quickly obtained from dropping down from the West of [[Floor 4 Beginning]] |341 |Medium |- | [[Bee Wings]] | [[File:Bee Wings.png|100px|link=[[Bee Wings]]]] | * Located on top of the tower on the North from [[Beginner's Grotto]] * Can be obtained by going South from [[Level 3 Ascent]] and then dropping down to the top of tower where the mask lies. |203 |Easy |- | [[Guardian Wings]] | [[File:Guardian Wings.png|100px|link=[[Guardian Wings]]]] | * Located on a broken bridge, East from the tower on the North from [[Beginner's Grotto]] * Can be obtained by going Southeast from [[Level 3 Ascent]] and then dropping down to the hridge where the mask lies. |156 |Easy |- | [[Void Cape]] | [[File:Void Cape.png|100px|link=[[Void Cape]]]] | * Located Northwest and below from [[Level 3 Ascent]] |410 |Easy |- | [[Souldeer Wings]] | [[File:Souldeer Wings.png|100px|link=[[Souldeer Wings]]]] | * Located below the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]]. * Can be quickly obtained by dropping from [[Floor 4 Beginning]]. |370 |Medium |- | [[Wings of Possession]] | [[File:Wings of Possession.png|100px|link=[[Wings of Possession]]]] | * Located behind a pillar in Southeast of [[Refinery Overlook]]. |1052 |Easy |} ==Miscellaneous Wings== Miscellaneous wings includes all the other wings that do not fit into any of the above sections. They include purchasable wings, wings obtained from loyalty rewards, and promotional wings. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Neon Whale]] | [[File:Neon Whale.png|100px|link=[[Neon Whale]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2128751729/Alpha-Player Alpha Player] badge from the game [https://www.roblox.com/games/10915082890/Whale-Survival Whale Survival]. |- | [[Cape Wing Blue]] | [[File:Cape Wing Blue.png|100px|link=[[Cape Wing Blue]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set]. |- | [[Rei's Wing]] | [[File:Rei's Wing.png|100px|link=[[Rei's Wing]]]] | Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set]. |- | [[Abital's Wings]] | [[File:Abital's Wings.png|100px|link=[[Abital's Wings]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set]. } b601f205327cd0e17653afdf2c15adda8aeeb51b 451 448 2023-11-26T08:03:45Z Reduckilous 4 i forgo to add the runic wing wikitext text/x-wiki {{See also|Masks|Dyes}} Wings are one of the three main cosmetics in the game. ==Normal Wings== Normal wings can be found in certain locations around the map that can be bought for prices ranging free up to 1000AE. They are the main form of collectable cosmetics along with masks and are counted towards the Available Collectable board in the end of the game. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[Glider Wing]] | [[File:Glider Wing.png|100px|link=[[Glider Wing]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Tulip Wing]] | [[File:Tulip Wing.png|100px|link=[[Tulip Wing]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Nix's Wings]] | [[File:Nix's Wings.png|100px|link=[[Nix's Wings]]]] | * Located in the Market shop in [[Abyssal Sanctum Market]] and can be directly bought from there. |0 |Easy |- | [[Warped Wings]] | [[File:Warped Wings.png|100px|link=[[Warped Wings]]]] | * Located behind a big broken pillar on the East of the map, ground floor. |0 |Medium |- | [[Megaannum Wings]] | [[File:Megaannum Wings.png|100px|link=[[Megaannum Wings]]]] | * Located at the end of the "Orb vault" in the South of [[Plinko Overlook]]. |324 |Easy |- | [[Large Ring Wing]] | [[File:Large Ring Wing.png|100px|link=[[Large Ring Wing]]]] | * Located under the small parkour section North of [[Witness Store]] which can be directly dropped down into. |247 |Easy |- | [[Lilith's Wings]] | [[File:Lilith's Wings.png|100px|link=[[Lilith's Wings]]]] | * Located near under the [[Witness Store]] and behind a pillar. * Can be obtained by going East from [[Witness Store]] and drop down to the support beams section far above [[Sanctum Overlook]]. |196 |Medium |- | [[Scaled Shell]] | [[File:Scaled Shell.png|100px|link=[[Scaled Shell]]]] | * Located in the center of 4 pillars, on the West from under the bridge before [[The Second Gate]]. |321 |Easy |- | [[Wings of the Fallen]] | [[File:Wings of the Fallen.png|100px|link=[[Wings of the Fallen]]]] | * Located in a small hall way next to a room with an echo, on the upper Southeast from [[Witness Store]]. * Can be quickly obtained from dropping down from the West of [[Floor 4 Beginning]] |341 |Medium |- | [[Bee Wings]] | [[File:Bee Wings.png|100px|link=[[Bee Wings]]]] | * Located on top of the tower on the North from [[Beginner's Grotto]] * Can be obtained by going South from [[Level 3 Ascent]] and then dropping down to the top of tower where the mask lies. |203 |Easy |- | [[Guardian Wings]] | [[File:Guardian Wings.png|100px|link=[[Guardian Wings]]]] | * Located on a broken bridge, East from the tower on the North from [[Beginner's Grotto]] * Can be obtained by going Southeast from [[Level 3 Ascent]] and then dropping down to the hridge where the mask lies. |156 |Easy |- | [[Void Cape]] | [[File:Void Cape.png|100px|link=[[Void Cape]]]] | * Located Northwest and below from [[Level 3 Ascent]] |410 |Easy |- | [[Souldeer Wings]] | [[File:Souldeer Wings.png|100px|link=[[Souldeer Wings]]]] | * Located below the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]]. * Can be quickly obtained by dropping from [[Floor 4 Beginning]]. |370 |Medium |- | [[Wings of Possession]] | [[File:Wings of Possession.png|100px|link=[[Wings of Possession]]]] | * Located behind a pillar in Southeast of [[Refinery Overlook]]. |1052 |Easy |} ==Miscellaneous Wings== Miscellaneous wings includes all the other wings that do not fit into any of the above sections. They include purchasable wings, wings obtained from loyalty rewards, and promotional wings. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:13%" scope="col"| Name !style="background-color:#3472AD; Width:12%" scope="col"| Appearance !style="background-color:#3472AD" scope="col" |Obtainment |- | [[Neon Whale]] | [[File:Neon Whale.png|100px|link=[[Neon Whale]]]] | Claimed from Loyalty Reward while having the [https://www.roblox.com/badges/2128751729/Alpha-Player Alpha Player] badge from the game [https://www.roblox.com/games/10915082890/Whale-Survival Whale Survival]. |- | [[Cape Wing Blue]] | [[File:Cape Wing Blue.png|100px|link=[[Cape Wing Blue]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12775128/Truth-Set Truth Set]. |- | [[Rei's Wing]] | [[File:Rei's Wing.png|100px|link=[[Rei's Wing]]]] | Obtained from buying the [https://www.roblox.com/game-pass/13474280/The-Mask-and-Wings-of-Rei-The-3rd-Vessel Rei's Set]. |- | [[Abital's Wings]] | [[File:Abital's Wings.png|100px|link=[[Abital's Wings]]]] | Obtained from buying the [https://www.roblox.com/game-pass/12778368/Abitals-Set Abital's set]. |- | [[Runic Wings]] | [[File:Runic Wings.png|100px|link=[[Runic Wings]]]] | Obtained from buying the [https://www.roblox.com/game-pass/247799076/Runic-Set Runic Set]. } 3c8e585d5c277cb88e0db4eeae52c753f4889994 File:Runic's Wings.png 6 333 450 2023-11-26T08:03:00Z Reduckilous 4 Reduckilous moved page [[File:Runic's Wings.png]] to [[File:Runic Wings.png]]: Misspelled title wikitext text/x-wiki #REDIRECT [[File:Runic Wings.png]] 76ebb22c2c5d3836b65045ea31fe4d6d26a4dd8b Dyes 0 218 452 414 2023-11-26T08:05:53Z Reduckilous 4 see also wikitext text/x-wiki {{See also|Wings|Masks}} == Normal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffb5b4" | [[Red Dye|Red]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#fdfff7" | [[Green Dye|Green]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#ffff07" | [[Yellow Dye|Yellow]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#e7feff" | [[Blue Dye|Blue]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#05ffff" | [[Cyan Dye|Cyan]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#ff02ff" | [[Purple Dye|Purple]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#fffdff" | [[Pink Dye|Pink]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#b702ff" | [[Violet Dye|Violet]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ffedf3" | [[Light Red Dye|Light Red]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#fdff05" | [[Lime Dye|Lime]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]] |Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]] |0 |Medium |} == Seasonal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffe03c" | [[Orange Dye|Orange]] |[[Sanctum Overlook]], next to the NPC with the same dye color. |72 |Easy |} b18caa6080b14f9760c6705958812aabe36e162a 453 452 2023-11-26T08:51:06Z Reduckilous 4 Notice wikitext text/x-wiki {{See also|Wings|Masks}} Note: All Dye names used on this page are '''subject to change''' and are currently referred with community made names. == Normal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffb5b4" | [[Red Dye|Red]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#fdfff7" | [[Green Dye|Green]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#ffff07" | [[Yellow Dye|Yellow]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#e7feff" | [[Blue Dye|Blue]] |Located in the Dye Store in [[Abyssal Sanctum Market]] |8 |Easy |- |style="background-color:#05ffff" | [[Cyan Dye|Cyan]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#ff02ff" | [[Purple Dye|Purple]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#fffdff" | [[Pink Dye|Pink]] |Located in the Dye Store in [[Level 2 Ascent]] |168 |Easy |- |style="background-color:#09a8ff" | [[Deep Blue Dye|Deep Blue]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#b702ff" | [[Violet Dye|Violet]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ff0205" | [[Deep Red Dye|Deep Red]] |Located in the Dye Store in [[Level 3 Ascent]] |457 |Easy |- |style="background-color:#ffedf3" | [[Light Red Dye|Light Red]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#f3ffff" | [[Light Cyan Dye|Light Cyan]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#fdff05" | [[Lime Dye|Lime]] |Located in the Dye Store in [[Floor 4 Beginning]] |824 |Easy |- |style="background-color:#6300d5" | [[Deep Purple Dye|Deep Purple]] |Located in the small broken room next to the [[Loyalty Hall]] portal in [[Abyssal Sanctum Market]] |0 |Medium |} == Seasonal Dyes == {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:20%" scope="col"| Color !style="background-color:#3472AD" scope="col" |Location !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- |style="background-color:#ffe03c" | [[Orange Dye|Orange]] |[[Sanctum Overlook]], next to the NPC with the same dye color. |72 |Easy |} c24b7f6b8b5d020b95e3357f52952f32492c09c4 File:Large Ring Wing Showcase.png 6 334 454 2023-11-26T09:19:11Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Nix's Wings Icon.png 6 335 455 2023-11-26T09:19:11Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Nix's Wings Showcase.png 6 336 456 2023-11-26T09:19:14Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Tulip Wing Icon.png 6 337 457 2023-11-26T09:19:15Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Tulip Wing Showcase.png 6 338 458 2023-11-26T09:19:15Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Warped Wings Icon.png 6 339 459 2023-11-26T09:19:20Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Warped Wings Location.png 6 340 460 2023-11-26T09:19:22Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Warped Wings Showcase.png 6 341 461 2023-11-26T09:19:25Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Glider Wing Icon.png 6 342 462 2023-11-26T09:19:27Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Glider Wing Location.png 6 343 463 2023-11-26T09:19:28Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Glider Wing Showcase.png 6 344 464 2023-11-26T09:19:32Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Large Ring Wing Icon.png 6 345 465 2023-11-26T09:19:35Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 File:Large Ring Wing Location.png 6 346 466 2023-11-26T09:19:36Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=Wings images for gallery}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} ecacf85947ab111070203b4ba92f551f859d1746 Glider Wing 0 347 467 2023-11-26T09:24:28Z Reduckilous 4 Created page with "{{Wings | name = Glider Wing | description = A wing designed to glide through the air. It's unfortunately not very effective though. | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries. | appearance = The wing resembles a real life Hang Glider but are much smaller and have..." wikitext text/x-wiki {{Wings | name = Glider Wing | description = A wing designed to glide through the air. It's unfortunately not very effective though. | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries. | appearance = The wing resembles a real life Hang Glider but are much smaller and have a steep curve instead. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Glider Wing Icon.png|The In-game icon of the mask Glider Wing Location.png|The surrounding of the location of the mask Glider Wing Showcase.png|Showcasing an Abyssal Walker wearing the mask </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. }} 7e830a369d781993daab0749e7b032e3bbfb924b 468 467 2023-11-26T09:29:28Z Reduckilous 4 typo woopsies. wikitext text/x-wiki {{Wings | name = Glider Wing | description = A wing designed to glide through the air. It's unfortunately not very effective though. | location = [[Abyssal Sanctum Market]] | price = 0 | lead = The '''Glider Wing''' is one of the wings sold in the Market and can be bought for free. Because of this, the Glider Wing is usually the first wing that players carries. | appearance = The wing resembles a real life Hang Glider but are much smaller and have a steep curve instead. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Glider Wing Icon.png|The In-game icon of the wing Glider Wing Location.png|The surrounding of the location of the wing Glider Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. }} 125472133db866e7847fcb4874c23d10c3381905 Tulip Wing 0 348 469 2023-11-26T09:30:42Z Reduckilous 4 Created page with "{{Wings | name = Tulip Wing | description = Wings crafted from the petals of a tulip, harvested at the peak of their brilliance. | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The '''Tulip Wing''' is one of the wings sold in the Market. | appearance = The wing resemble an upside down Tulip when they bloom. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347;..." wikitext text/x-wiki {{Wings | name = Tulip Wing | description = Wings crafted from the petals of a tulip, harvested at the peak of their brilliance. | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The '''Tulip Wing''' is one of the wings sold in the Market. | appearance = The wing resemble an upside down Tulip when they bloom. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Tulip Wing Icon.png|The In-game icon of the wing Glider Wing Location.png|The surrounding of the location of the wing Tulip Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. }} 8b055dbc960a8e0229b242583a1478ace2365274 Nix's Wings 0 349 470 2023-11-26T09:42:50Z Reduckilous 4 Created page with "{{Wings | name = Nix's Wings | description = Wings worn by the fabled warrior Nix. The material is from a sacred place long forgotten. | location = [[Abyssal Sanctum Market]] | price = 1000 | lead = The '''Nix's Wings''' is the most expensive wings sold in the Market. | appearance = The wing are 3 diamond shaped, shard like, wings attached together. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]]. | gallery = <gallery sty..." wikitext text/x-wiki {{Wings | name = Nix's Wings | description = Wings worn by the fabled warrior Nix. The material is from a sacred place long forgotten. | location = [[Abyssal Sanctum Market]] | price = 1000 | lead = The '''Nix's Wings''' is the most expensive wings sold in the Market. | appearance = The wing are 3 diamond shaped, shard like, wings attached together. | obtain = *Buy it in the Market in [[Abyssal Sanctum Market]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Nix's Wings Icon.png|The In-game icon of the wing Glider Wing Location.png|The surrounding of the location of the wing Nix's Wings Showcase.png|Showcasing an Abyssal Walker wearing the wing </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. *This is the only wing in the game that have 3 wings. }} e6bbb4a131332e4cdb89ddc147202d8ba1010f68 Warped Wings 0 350 471 2023-11-26T10:01:33Z Reduckilous 4 Created page with "{{Wings | name = Warped Wings | description = Wings warped from the immense pressure of the abyss. | location = [[Beginner's Grotto]] | price = 400 | lead = The '''Warped Wings''' gives off a mysterious vibe, which is why many player seems to love it. | appearance = The wings appears as 2 spirals, with the one on the left spiral in counter clockwise, while the right one spiral closewise. However, the spirals are not clearly visualized as it is all..." wikitext text/x-wiki {{Wings | name = Warped Wings | description = Wings warped from the immense pressure of the abyss. | location = [[Beginner's Grotto]] | price = 400 | lead = The '''Warped Wings''' gives off a mysterious vibe, which is why many player seems to love it. | appearance = The wings appears as 2 spirals, with the one on the left spiral in counter clockwise, while the right one spiral closewise. However, the spirals are not clearly visualized as it is all neon. | obtain = *It is located in the very East on ground floor and behind a big broken pillar. It is also far behind the 20 Echoes required '''room''' aswell. *You can get to the wing by going East from [[Beginner's Grotto]] to the very end of the map, and then look for pillars around there and you should be able to spot the wing quite easily. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Warped Wings Icon.png|The In-game icon of the wing Warped Wings Location.png|The surrounding of the location of the wing Warped Wings Showcase.png|Showcasing an Abyssal Walker wearing the wing </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. *Different from it's Journey to the Sun counter part - Spiral Wings; this wing are not warped from the cruel votes of Votedown. }} c6b74cd0bd1036c052c882dce3f91349e52b1642 Large Ring Wing 0 351 472 2023-11-26T10:11:53Z Reduckilous 4 Created page with "{{Wings | name = Large Ring Wing | description = Similar to the ring wings of the Abyssals, but larger. Where could it have come from? | location = [[Witness Store]] | price = 400 | lead = The Large Ring Wing is simple bigger version of the default wing of the player. | appearance = The wing is a big circle, and resembles a large version of an angel's halo. | obtain = *It is located in between 2 horizontal support beam below the North of ..." wikitext text/x-wiki {{Wings | name = Large Ring Wing | description = Similar to the ring wings of the Abyssals, but larger. Where could it have come from? | location = [[Witness Store]] | price = 400 | lead = The Large Ring Wing is simple bigger version of the default wing of the player. | appearance = The wing is a big circle, and resembles a large version of an angel's halo. | obtain = *It is located in between 2 horizontal support beam below the North of [[Witness Store]]. *It can be obtained by following the mini parkour section on the East of [[Witness Store]] that begins with a ladder. *It can be also obtained by falling down from the parkour section that comes after [[Witness Store]] into between the 2 beams, where the wing lies. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Large Ring Wing Icon.png|The In-game icon of the wing Large Ring Wing Location.png|The surrounding of the location of the wing Large Ring Wing Showcase.png|Showcasing an Abyssal Walker wearing the wing </gallery> | trivia = *This wing have the same model as the ones in Journey to the sun. }} 82eb56a7ba2f94002bb924a96a7d7addf35761bf Echoes 0 352 473 2023-11-26T14:57:32Z Reduckilous 4 W.I.P wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:12%" scope="col" | Surrounding !style="background-color:#3472AD" scope="col" | Location !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | [[1]] | [[File:Placeholder.png|100px]] | * placeholder bb17701bdfcc6fdb54ff9d4416db68a978a51e2f File:153m Echo.png 6 354 474 2023-11-26T16:57:21Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:126m Echo.png 6 355 475 2023-11-26T16:57:21Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:136m Echo.png 6 353 476 2023-11-26T16:57:21Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:168m Echo.png 6 356 477 2023-11-26T16:57:29Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:286m Echo.png 6 357 478 2023-11-26T16:57:30Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:311m Echo.png 6 358 479 2023-11-26T16:57:30Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:362m Echo.png 6 359 480 2023-11-26T16:57:38Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:339m Echo.png 6 360 481 2023-11-26T16:57:38Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:411m Echo.png 6 361 482 2023-11-26T16:57:40Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:426m Echo.png 6 362 483 2023-11-26T16:57:46Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:498m Echo.png 6 363 484 2023-11-26T16:57:46Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:583m Echo.png 6 364 485 2023-11-26T16:57:51Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:597m Echo.png 6 365 486 2023-11-26T16:57:57Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:823m Echo.png 6 366 487 2023-11-26T16:57:58Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:939m Echo.png 6 367 488 2023-11-26T16:58:01Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:951m Echo.png 6 368 489 2023-11-26T16:58:06Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:1007m Echo.png 6 369 490 2023-11-26T16:58:06Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:1142m Echo.png 6 370 491 2023-11-26T16:58:12Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:1m Echo.png 6 371 492 2023-11-26T16:58:14Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:1231m Echo.png 6 372 493 2023-11-26T16:58:17Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:23m Echo.png 6 373 494 2023-11-26T16:58:20Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:40m Echo.png 6 374 495 2023-11-26T16:59:48Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:63m Echo.png 6 375 496 2023-11-26T16:59:50Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:24m Echo.png 6 376 497 2023-11-26T16:59:50Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 File:95m Echo.png 6 377 498 2023-11-26T16:59:52Z Reduckilous 4 Uploaded own work with UploadWizard wikitext text/x-wiki =={{int:filedesc}}== {{Information |description={{lua|1=For the echoes page}} |date=2023-11-26 |source={{own}} |author=[[User:Reduckilous|Reduckilous]] |permission= |other versions= }} =={{int:license-header}}== {{self|cc-by-sa-4.0}} dd9ec31e0f24d9658ec2163cd8781f56493889d6 Red Dye 0 295 499 405 2023-11-27T06:30:51Z Reduckilous 4 added minor info-Reducki from school wikitext text/x-wiki {{Dyes | name = Red Dye | minhex = <nowiki>#ff9797</nowiki> | maxhex = <nowiki>#ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|Showcasing the Dye without accessories Red Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 9a0d8d97fe111d4795f1fd7c805b1e44726c9c09 Blue Dye 0 298 500 408 2023-11-27T06:31:32Z Reduckilous 4 minor detail added wikitext text/x-wiki {{Dyes | name = Blue Dye | minhex = <nowiki>#ccfaff</nowiki> | maxhex = <nowiki>#e7feff</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Blue Dye Bottle.png|The Dye Bottle Blue Dye Showcase.png|Showcasing the Dye without accessories Blue Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} a2b55f3a3e71ea91b78c223b228fbbe38c255088 Yellow Dye 0 297 501 407 2023-11-27T06:32:26Z Reduckilous 4 Minor adjustment - Reduck from school wikitext text/x-wiki {{Dyes | name = Yellow Dye | minhex = <nowiki>#fffd02</nowiki> | maxhex = <nowiki>#ffff07</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Yellow Dye Bottle.png|The Dye Bottle Yellow Dye Showcase.png|Showcasing the Dye without accessories Yellow Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 1a1fd4adafbc0dd9684a538d69eda9fe27953cb5 Green Dye 0 296 502 406 2023-11-27T06:33:13Z Reduckilous 4 minor stuff wikitext text/x-wiki {{Dyes | name = Green Dye | minhex = <nowiki>#faffef</nowiki> | maxhex = <nowiki>#fdfff7</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Green Dye Bottle.png|The Dye Bottle Green Dye Showcase.png|Showcasing the Dye without accessories Green Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 4df236efdffa88c1176b220db47fcfc968537b9f 514 502 2023-11-27T15:58:07Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Green Dye | minhex = <nowiki>faffef</nowiki> | maxhex = <nowiki>fdfff7</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Green Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Green Dye Bottle.png|The Dye Bottle Green Dye Showcase.png|Showcasing the Dye without accessories Green Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 1603893606829f10c27d3289543008fdeef58585 File:Abyssal favicon.png 6 378 503 2023-11-27T11:45:25Z Reduckilous 4 For the wiki's favicon. wikitext text/x-wiki == Summary == For the wiki's favicon. b7a4479d8a1dc76b660d7730d61139dc96a92201 File:Abyssal Icon New.svg 6 381 506 2023-11-27T13:34:34Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 507 506 2023-11-27T13:36:41Z Reduckilous 4 Reduckilous uploaded a new version of [[File:Abyssal Icon New.svg]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Abyssal Wordmark.svg 6 382 508 2023-11-27T13:37:57Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 509 508 2023-11-27T13:56:37Z Reduckilous 4 Reduckilous uploaded a new version of [[File:Abyssal Wordmark.svg]] wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 File:Favicon.ico 6 383 510 2023-11-27T15:40:13Z Reduckilous 4 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 Template:Dyes 10 276 511 384 2023-11-27T15:56:00Z Reduckilous 4 adding the tag beforehand wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = &num; {{{minhex|}}} | label2 = Max Graphic Hex | data2 = &num; {{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Dyes]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> b0ee24e5fa8773f523c478b4fbe6994da6ef972b 518 511 2023-11-27T15:59:24Z Reduckilous 4 removing the space wikitext text/x-wiki <includeonly>{{Infobox | bodystyle = background-color:#0B2347; color: #FFFFF5 | abovestyle = background-color:#3472AD; font-size:20px; padding:7px | above = {{{name|}}} | image = [[File:{{#if:{{{no-icon|}}}|No-image|{{{name|}}}}}.png|250px]] | label1 = Min Graphic Hex | data1 = &num;{{{minhex|}}} | label2 = Max Graphic Hex | data2 = &num;{{{maxhex|}}} | label3 = Location | data3 = {{{location|}}} | label4 = Price | data4 = {{{price|0}}} AE }} {{{lead|}}} __NOEDITSECTION__ ==Obtainment== {{{obtain|}}} {{#if:{{{gallery|}}}|<h2>Gallery</h2> {{{gallery|}}}|}} {{#if:{{{trivia|}}}|<h2>Trivia</h2> {{{trivia|}}}|}} {{#if:{{{refs|}}}|<h2>References</h2> <references/>|}} [[Category:Dyes]]</includeonly><noinclude> {{Documentation}} [[Category:Page templates]] </noinclude> e7f33132feebe1fc0bfce410969f2206e5e4701b Template:Dyes/doc 10 277 512 385 2023-11-27T15:57:08Z Reduckilous 4 adjusting the guideline wikitext text/x-wiki This template is used as a blueprint to create articles for [[Dyes|dyes]]. == Usage == See [[Template:Dyes/doc#Parameters|Parameters]] for an explanation of each parameter. <pre> {{Dyes | name = | minhex = | maxhex = | location = | price = | lead = | obtain = | gallery = | trivia = | refs = }} </pre> == Parameters == ; name : The name of the dye. ; minhex : The hex value of the color display when the game's graphic is put the minimum. No need to type the # in the beginning. ; minhex : The hex value of the color display when the game's graphic is put the maximum. No need to type the # in the beginning. ; location : ; price : The price the player has to pay. ; lead : A short summary of the dye. ; obtain : A bulleted list containing various methods to obtain the dye. Still applies even if there is only one method. ; gallery : A gallery of images showcasing the dye. Use the following format: <pre> <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> </gallery> </pre> : See [[wikipedia:Help:Gallery tag|here]] on how to use the <tt><gallery></tt> tag. ; trivia : A bulleted list of trivia related to the dye. Guidelines on what can be considered trivia coming soon. ; refs : If <tt><ref></tt> tags has been used in the article, set this parameter to <tt>true</tt> 06c0a9bc80b5040e12fc1a79adc9cde2241c1666 Red Dye 0 295 513 499 2023-11-27T15:57:33Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Red Dye | minhex = <nowiki>ff9797</nowiki> | maxhex = <nowiki>ffb5b4</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Red Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Red Dye Bottle.png|The Dye Bottle Red Dye Showcase.png|Showcasing the Dye without accessories Red Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} f8b817434f6649e0071ba60981a0b923ed7c1f7a Yellow Dye 0 297 515 501 2023-11-27T15:58:20Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Yellow Dye | minhex = <nowiki>fffd02</nowiki> | maxhex = <nowiki>ffff07</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Yellow Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Yellow Dye Bottle.png|The Dye Bottle Yellow Dye Showcase.png|Showcasing the Dye without accessories Yellow Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} 8de6e753f62962f871ebe295897da5ed29b165cb Blue Dye 0 298 516 500 2023-11-27T15:58:32Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Blue Dye | minhex = <nowiki>ccfaff</nowiki> | maxhex = <nowiki>e7feff</nowiki> | location = [[Abyssal Sanctum Market]] | price = 100 | lead = The Blue Dye is one of the 4 dyes in the first Dye Shop of the game. It is also one of the color a player can first spawn with. | obtain = *It is located in Dye Shop in [[Abyssal Sanctum Market]] | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Blue Dye Bottle.png|The Dye Bottle Blue Dye Showcase.png|Showcasing the Dye without accessories Blue Dye Full Showcase.png|Showcasing the Dye with accessories Red Dye Location.png|The Dye's location </gallery> }} c74ba66f618259cfb9da8e5838e1dacd49033b00 Deep Purple Dye 0 309 517 425 2023-11-27T15:58:51Z Reduckilous 4 wikitext text/x-wiki {{Dyes | name = Deep Purple Dye | minhex = <nowiki>6301d5</nowiki> | maxhex = <nowiki>6300d5</nowiki> | location = [[Abyssal Sanctum Market]] | price = 800 | lead = The Deep Purple Dye is the easiest hidden dye in the game for it being so near the spawn. | obtain = *It is located a rundown hut in the Southeast corner in the walls of [[Abyssal Sanctum Market]]. | gallery = <gallery style="background-color:#0B2347; width:53%; color:#FFFFF5"> Deep Purple Dye Bottle.png|The Dye Bottle Deep Purple Dye Showcase.png|Showcasing the Dye without accessories Deep Purple Dye Full Showcase.png|Showcasing the Dye with accessories Deep Purple Dye Location.png|The Dye's location </gallery> }} 66e01d3320a6690575504c38d6c81e7ca9fdd52e Echoes 0 352 519 473 2023-11-27T17:57:16Z Reduckilous 4 still W.I.P wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:20%" scope="col" | Surrounding !style="background-color:#3472AD" scope="col" | Location !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | 1 | [[File:1m Echo.png|250px]] | * Located in a small secluded room with many horizontal beam. Northwest of [[Abyssal Sanctum Market]]. West of the map. * Can be quickly obtained by going backward from [[Sanctum Overlook]], then follow East to the echo. |Easy |- | 23 | [[File:23m Echo.png|250px]] | * Located on a small bridge in the middle between [[Sanctum Overlook]] and [[Beginner's Grotto]], can be spotted and obtained easily. |Easy |- | 24 | [[File:24m Echo.png|250px]] | * Located on an altar like place in the East of the map. Directly East from [[Beginner's Grotto]]. * Can be obtained by going left of the gate from [[The First Gate]] and fall down to the West onto the place where the echo lies. |Easy |- | 40 | [[File:40m Echo.png|250px]] | * Located on a tall tower on the Northwest corner of the map. Northwest from [[Beginner's Grotto]]. * Can be obtained by going East from [[The Second Gate]] and then fall down to the tower where the echo lies. |Easy |- | 63 | [[File:63m Echo.png|250px]] | * Located on a tall tower on the East of the map. Southeast from [[Beginner's Grotto]]. Behind the 20 Echo room. * Can be obtained by going West from [[The First Gate]] and then [[Techs|Cancel Velocity]] down to the the bridge that is attached to the tower where the echo lies. |Easy |- | 95 | [[File:95m Echo.png|250px]] | * Located on the third story of the building on the North of [[Beginner's Grotto]] * Can be obtained by going South from [[Level 3 Ascent]] and falling down to the third story of the building where the echo lies. |Medium |- | 126 | [[File:126m Echo.png|250px]] | * Located directly Infront of [[The First Gate]] and can be directly obtained from there. |Easy |- | 136 | [[File:136m Echo.png|250px]] | * Located in the "pipe" in the West of the map, can be seen from [[The First Gate]]. * Can be obtained by falling down the North of [[Witness Store]] on to the pipe, and then entered through it's open end, and to the echo with a Another Player. |Hard |- | 153 | [[File:153m Echo.png|250px]] | * Located on a tall tower that is Southeast on the map, Southwest from [[The First Gate]] * Can be obtained by falling from the bridge between [[Plinko Overlook]] and [[Witness Store]], landing on the top of the tower where the echo lies. |Medium |- | 168 | [[File:168m Echo.png|250px]] | * Located in the room directly west from [[Level 2 Ascent]] and can be directly obtained from there. |Easy |- | 286 | [[File:286m Echo.png|250px]] | * Directly East from [[Plinko Overlook]] and can be directly obtained from there. |Easy |- | 311 | [[File:311m Echo.png|250px]] | * Located in the Orb Vault next to [[Plinko Overlook]] and requires Another Player to obtain. |Medium |- | 339 | [[File:339m Echo.png|250px]] | * Located on a big platform in the middle of [[Witness Store]] and [[The Second Gate]]. * Can be obtained by getting it on the normal route. Or falling on it from the Northern bridge on [[Tower of Isolation]] |Easy |- | 362 | [[File:362m Echo.png|250px]] | * Located in the end of the small parkour course in the Southeast of the map. Upper East from [[Witness Store]]. * Can be obtained by falling to the parkour section from [[Tower of Isolation]] or [[Floor 4 Beginning]] and then completing it with Another Player. |Medium |- | 411 | [[File:411m Echo.png|250px]] | * Located in the ceiling of the big room that comes before [[The Second Gate]]. * Can be obtained by going East of said room and climb up the small platform on the side of the entrance to the "Balcony" to the ceiling and then navigating to the echo from there. |Medium 576687e77a13713dad184bf34558ac01aea2826b 520 519 2023-11-28T03:51:25Z Reduckilous 4 I think that's all the current echos :3 wikitext text/x-wiki {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Height !style="background-color:#3472AD; Width:20%" scope="col" | Surrounding !style="background-color:#3472AD" scope="col" | Location !style="background-color:#3472AD; Width:15%" scope="col" | Difficulty |- | 1 | [[File:1m Echo.png|250px]] | * Located in a small secluded room with many horizontal beam. Northwest of [[Abyssal Sanctum Market]]. West of the map. * Can be quickly obtained by going backward from [[Sanctum Overlook]], then follow East to the echo. |Easy |- | 23 | [[File:23m Echo.png|250px]] | * Located on a small bridge in the middle between [[Sanctum Overlook]] and [[Beginner's Grotto]], can be spotted and obtained easily. |Easy |- | 24 | [[File:24m Echo.png|250px]] | * Located on an altar like place in the East of the map. Directly East from [[Beginner's Grotto]]. * Can be obtained by going left of the gate from [[The First Gate]] and fall down to the West onto the place where the echo lies. |Easy |- | 40 | [[File:40m Echo.png|250px]] | * Located on a tall tower on the Northwest corner of the map. Northwest from [[Beginner's Grotto]]. * Can be obtained by going East from [[The Second Gate]] and then fall down to the tower where the echo lies. |Easy |- | 63 | [[File:63m Echo.png|250px]] | * Located on a tall tower on the East of the map. Southeast from [[Beginner's Grotto]]. Behind the 20 Echo room. * Can be obtained by going West from [[The First Gate]] and then [[Techs|Cancel Velocity]] down to the the bridge that is attached to the tower where the echo lies. |Easy |- | 95 | [[File:95m Echo.png|250px]] | * Located on the third story of the building on the North of [[Beginner's Grotto]] * Can be obtained by going South from [[Level 3 Ascent]] and falling down to the third story of the building where the echo lies. |Medium |- | 126 | [[File:126m Echo.png|250px]] | * Located directly Infront of [[The First Gate]] and can be directly obtained from there. |Easy |- | 136 | [[File:136m Echo.png|250px]] | * Located in the "pipe" in the West of the map, can be seen from [[The First Gate]]. * Can be obtained by falling down the North of [[Witness Store]] on to the pipe, and then entered through it's open end, and to the echo with a Another Player. |Hard |- | 153 | [[File:153m Echo.png|250px]] | * Located on a tall tower that is Southeast on the map, Southwest from [[The First Gate]] * Can be obtained by falling from the bridge between [[Plinko Overlook]] and [[Witness Store]], landing on the top of the tower where the echo lies. |Medium |- | 168 | [[File:168m Echo.png|250px]] | * Located in the room directly west from [[Level 2 Ascent]] and can be directly obtained from there. |Easy |- | 286 | [[File:286m Echo.png|250px]] | * Directly East from [[Plinko Overlook]] and can be directly obtained from there. |Easy |- | 311 | [[File:311m Echo.png|250px]] | * Located in the Orb Vault next to [[Plinko Overlook]] and requires Another Player to obtain. |Medium |- | 339 | [[File:339m Echo.png|250px]] | * Located on a big platform in the middle of [[Witness Store]] and [[The Second Gate]]. * Can be obtained by getting it on the normal route. Or falling on it from the Northern bridge on [[Tower of Isolation]] |Easy |- | 362 | [[File:362m Echo.png|250px]] | * Located in the end of the small parkour course in the Southeast of the map. Upper East from [[Witness Store]]. * Can be obtained by falling to the parkour section from [[Tower of Isolation]] or [[Floor 4 Beginning]] and then completing it with Another Player. |Medium |- | 411 | [[File:411m Echo.png|250px]] | * Located in the ceiling of the big room that comes before [[The Second Gate]]. * Can be obtained by going East of said room and climb up the small platform on the side of the entrance to the "Balcony" to the ceiling and then navigating to the echo from there. |Medium |- | 426 | [[File:426m Echo.png|250px]] | * Located on an "altar" Northeast of [[The Second Gate]], very easy to spot. * Can be obtained by going right up to the actual gate, then turn North before you enter to the parkour section of the echo. |Easy |- | 498 | [[File:498m Echo.png|250px]] | * On top of the hut at the start of the Ladder Unit section between [[Level 3 Ascent]] and [[Tower of Isolation]]. East of the map. * Can be obtained by climbing the mini platform next to the hut, requires Another Player. |Easy |- | 583 | [[File:583m Echo.png|250px]] | * Located to a platform on the ceiling of the first parkour section after [[Level 3 Ascent]]. Northeast of the map. * Can be obtained by climbing the Southwest 2 player part of the parkour section with another player and reach the end of that course. |Hard |- | 597 | [[File:597m Echo.png|250px]] | * Located on the platform directly above [[Tower of Isolation]]. * Can be obtained by going to the end of the bridge that goes after [[Tower of Isolation]], then parkour through the roof of the bridge with Another Player back to where the echo is. |Medium |- | 823 | [[File:823m Echo.png|250px]] | * Located in the huge Eastern water tank in [[Floor 4 Beginning]]-[[Refinery Overlook]]. Northwest of the map. * Can be obtained by following the normal route through [[Floor 4 Beginning]], then deviate to the South after reaching the Northwest part of the section to fall down and into the tank. |Medium |- | 939 | [[File:939m Echo.png|250px]] | * Located on top of the huge Southwest tower right after [[Floor 4 Beginning]]. * Can be obtained by dropping down onto the tower from the conveyor belts right after [[Refinery Overlook]] |Easy |- | 951 | [[File:951m Echo.png|250px]] | * Located in a room in the Northeast corner of [[Floor 4 Beginning]]-[[Refinery Overlook]]. * Can be obtained by going on the normal route, then go to the very Northeast corner of the map and enter the room through an entrance on the South. |Medium |- | 1007 | [[File:1007m Echo.png|250px]] | * Located on a high platform above a closed door in the North of [[Floor 4 Beginning]]-[[Refinery Overlook]]. * Can be obtained by going Northwest from [[Level 4 Ending]] and fall down to the platform where the echo lies. |Medium |- | 1142 | [[File:1142m Echo.png|250px]] | * Located on a 2 player parkour course on the South of [[Refinery Overlook]]-[[Level 4 Ending]]. * Can be obtained by going to the South end from [[Level 4 Ending]] and drop down on the East edge, onto the platform where the echo lies. |Medium |- | 1231 | [[File:1231m Echo.png|250px]] | * Located on a tank right above the roof of [[Refinery Overlook]]. Southeast of the map. * Can be obtained by going to the South end from [[Level 4 Ending]] and [[Techs|Cancel Velocity]] down to the East from there to land on the echo. |Medium 33dfedc0f8f9181c5280d0d131797e183bcd6794 Witnesses 0 384 521 2023-11-28T04:53:43Z Reduckilous 4 Created page with "Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are Each witness have their own respective tank when bou..." wikitext text/x-wiki Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again. ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) e80f9804ef071608a6304e29c229ea1d33ae48df 522 521 2023-11-28T04:55:58Z Reduckilous 4 wikitext text/x-wiki Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once. Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again. ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) a1c84b23c5bff1fe105ec194ea3ce2b4d92b6c0d 523 522 2023-11-28T06:02:47Z Reduckilous 4 Seperating the text for ease of reading -Reduck from school wikitext text/x-wiki <p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p> <p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p> <p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p> ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) 640398bbdd08bf3f16ec80b86f336ec959e83d73 524 523 2023-11-28T06:43:44Z Reduckilous 4 /* Faces and Colors */ wikitext text/x-wiki <p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p> <p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p> <p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p> ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) ==Trivia== *The 3 starter witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games. *Witnesses are first named "Pets" but later was rejected due to playtesters highly disagreeing with having straight up "Pets" in Abyssal. 4fa2dca87e1081c7138009068b905c3100293e6d 525 524 2023-11-28T13:27:28Z Reduckilous 4 wikitext text/x-wiki <p>Witnesses are your "Companion" in the game to make the main route of the game slightly easier to do. They can be bought at the [[Witness Store]] provide a variety of buff and utility quirks to assist you, but each witness require you to harvest Energy Orbs with them in order to activate their buffs. </p> <p>The 3 starter witnesses(Piconium, Luxura, Jellite) can be bought after unlocking [[The First Gate]] for free. They are required to continue on the [[Level 2 Ascent]]. However, they can be entirely skipped by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]], if this is done, you can buy one of the witnesses in [[Witness Store]] for free once.</p> <p>Each witness have their own respective tank when bought and cannot be placed to another tank even if that tank is empty. Witnesses do not buff you on Challenges and will be sent to their own tank if you do activate a challenge. However, you can re-equip your witness at [[Witness Store]] during the challenge and be able to use your buffs again.</p> ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought, but can be changed with Abyssal Energy based on what Mask or Dye you are using when changing their face and color. Some Masks do not give out a face to witnesses such as the masks from challenges and some of the mask from Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) ==Names== Here are a list of all the possible name a Witness can have. # Abyssinia # Abyssite # Abyssium # Abyssolus # Abyssquill # Abyssus # Abysswing # Aether # Amethysta # Argentum # Artemis # Asterea # Astral # Astrid # Aurorae # Aurorium # Azura # Calypsa # Celestia # Cerulean # Chronos # Cinderel # Cobalt # Cryoterra # Crystaria # Cynosure # Dracora # Drift # Duskmaw # Echo # Eclipse # Ecliptis # Elyssira # Elyssium # Ember # Embera # Ethera # Flamara # Geminara # Glimmer # Hallow # Hydronix # Icarus # Ignacia # Ignis # Ishtar # Lithora # Lumis # Lumithar # Lunara # Lunaris # Lustra # Marisca # Marlowe # Mica # Minerva # Nebulae # Nexara # Nihilius # Nimbus # Nivalis # Nocturne # Nova # Novaflare # Nyx # Nyxalis # Oblivis # Obscura # Obscuris # Obsidian # Oceania # Ombrosa # Onyx # Orin # Pebble # Phosphor # Pyronyx # Quartz # Quicksilver # Rune # Sable # Sablethorn # Seraph # Serenitea # Serpentis # Shadow # Solanum # Solara # Solarix # Solstice # Solunara # Spectralis # Stardust # Sylvanix # Sylvaris # Tempest # Tenebris # Terra # Terraquill # Thalassa # Thundara # Umbra # Valora # Verdant # Verdelith # Vesper # Vesperion # Virelia # Vortex # Zenith # Zenithar # Zephyr # Zephyra # Zirelia # Zyphrion ==Trivia== *The 3 starter witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games. *Witnesses are first named "Pets" but later was rejected due to playtesters highly disagreeing with having straight up "Pets" in Abyssal. 2baff2c14fb53c1a2a09949233225607f9e3b181 526 525 2023-11-29T13:34:53Z Reduckilous 4 Cleaning up abit wikitext text/x-wiki Witnesses are your 'Companion' in the game, designed to make the main route slightly easier to navigate. They can be purchased at the [[Witness Store]] and provide a variety of buffs and utility quirks to assist you. However, each witness requires you to harvest Energy Orbs with them to activate their buffs. The three starter witnesses (Piconium, Luxura, Jellite) can be acquired for free after unlocking [[The First Gate]]. They are essential for progressing to the [[Level 2 Ascent]]. However, you can entirely skip them by [[Techs|Double Jump Stacking]] over the gate to [[Level 2 Ascent]]. If you choose this method, you can later obtain one of the witnesses from the [[Witness Store]] for free. Each witness has its own respective tank upon purchase and cannot be placed in another tank, even if that tank is empty. Witnesses do not provide buffs during Challenges and will be sent to their own tank if you activate a challenge. However, you can re-equip your witness at the [[Witness Store]] during the challenge to regain access to their buffs. ==Buffs== Each Witness have 3 buff slot, each slot require a certain level that the respective witness need to meet. Each time you collect an orb with a Witness, that witness level goes up by 1. {| class="wikitable sortable" style="width:100%; border-color: #E0E28D;border-width:2px; background-color: #0B2347; text-align: center; color: #FFFFF5;" |- !style="background-color:#3472AD; Width:10%" scope="col" | Stat !style="background-color:#3472AD; Width:30%" scope="col" | Ability !style="background-color:#3472AD; Width:20%" scope="col" | Slot 1 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 2 Values !style="background-color:#3472AD; Width:20%" scope="col" | Slot 3 Values |- |Run Speed |Increases normal walking speed. |1 - 3 |4 - 6 |7 - 10 |- |Jump Height |Increases how high you can jump. |1 - 3 |4 - 6 |7 - 10 |- |Energy Conservation |Decrease the energy you spent on Rewinding, Using ability, etc |1 - 3 |4 - 6 |7 - 10 |- |Weight |Slow the speed at which you fall, also add a small upward force, making you jump slightly higher. |(-1) - (-3) |(-4) - (-6) |(-7) - (-10) |- |Dash Ability |Allow you to dash horizontally at a cost of some Abyssal Energy. Dashing on the air have less distance. | False | False | True |} ==Faces and Colors== Witnesses have their own face and color when bought but can be changed with Abyssal Energy based on the Mask or Dye you are using during the change. Some Masks do not provide a face to witnesses, such as those obtained from challenges and certain masks from the Journey to the Sun loyalty reward. If a mask is unable to grant a face to a witness, no Abyssal Energy will be spent. Some faces are exclusive to unchanged witnesses and cannot be applied with masks. (will add a table of possible faces here later) ==Names== Here are a list of all the possible name a Witness can have. # Abyssinia # Abyssite # Abyssium # Abyssolus # Abyssquill # Abyssus # Abysswing # Aether # Amethysta # Argentum # Artemis # Asterea # Astral # Astrid # Aurorae # Aurorium # Azura # Calypsa # Celestia # Cerulean # Chronos # Cinderel # Cobalt # Cryoterra # Crystaria # Cynosure # Dracora # Drift # Duskmaw # Echo # Eclipse # Ecliptis # Elyssira # Elyssium # Ember # Embera # Ethera # Flamara # Geminara # Glimmer # Hallow # Hydronix # Icarus # Ignacia # Ignis # Ishtar # Lithora # Lumis # Lumithar # Lunara # Lunaris # Lustra # Marisca # Marlowe # Mica # Minerva # Nebulae # Nexara # Nihilius # Nimbus # Nivalis # Nocturne # Nova # Novaflare # Nyx # Nyxalis # Oblivis # Obscura # Obscuris # Obsidian # Oceania # Ombrosa # Onyx # Orin # Pebble # Phosphor # Pyronyx # Quartz # Quicksilver # Rune # Sable # Sablethorn # Seraph # Serenitea # Serpentis # Shadow # Solanum # Solara # Solarix # Solstice # Solunara # Spectralis # Stardust # Sylvanix # Sylvaris # Tempest # Tenebris # Terra # Terraquill # Thalassa # Thundara # Umbra # Valora # Verdant # Verdelith # Vesper # Vesperion # Virelia # Vortex # Zenith # Zenithar # Zephyr # Zephyra # Zirelia # Zyphrion ==Trivia== *The 3 starter Witnesses are a references the the 3 Architects, as well as the 3 starter pokemon in most pokemon games. *Witnesses were initially referred to as 'Pets,' but this term was later rejected due to strong disagreement from playtesters who felt that having straightforward 'Pets' in Abyssal was not suitable. f7b19b4c3e97513dbdaaf4b945d1988274a40101